You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django Admin的"Change"页面中显示已上传的图片?

要在Django Admin的"Change"页面显示已上传图片的预览,你需要自定义Admin类来添加图片渲染逻辑——默认的ImageField只会显示文件链接,不会自动生成预览。下面是具体的实现步骤:

第一步:确保媒体文件配置正确(前提)

首先得保证Django能正确访问你上传的图片,需要在项目中配置媒体文件路径:

  1. 在项目的settings.py中添加以下配置:
MEDIA_ROOT = BASE_DIR / 'media'  # 媒体文件存储的本地目录
MEDIA_URL = '/media/'            # 访问媒体文件的URL前缀
  1. 在项目根目录的urls.py中添加媒体文件的路由(仅开发环境使用,生产环境请用Nginx等服务器处理静态/媒体文件):
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # 你的其他URL配置,比如admin路由
    path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

第二步:修改Admin类实现图片预览

接下来修改你的admin.py,自定义图片预览的逻辑:

from django.contrib import admin
from django.utils.html import format_html  # 生成安全的HTML标签,避免XSS风险
from .models import Product

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    # 自定义方法:生成图片预览的HTML代码
    def image_preview(self, obj):
        # 如果对象已上传图片,返回预览标签;否则提示无图片
        if obj.image:
            return format_html(
                '<img src="{}" style="max-height: 200px; max-width: 200px;" alt="Product Image" />',
                obj.image.url
            )
        return "No image uploaded"
    
    # 设置该方法在Admin页面显示的名称
    image_preview.short_description = 'Image Preview'
    
    # 配置编辑页面的字段顺序,将预览字段加入并设为只读(无需编辑)
    fields = ('name', 'price', 'image', 'image_preview')
    readonly_fields = ('image_preview',)

这样修改后,当你进入Product的Change页面时,就能在图片上传字段下方看到已上传图片的预览了;如果还没上传图片,会显示"No image uploaded"的提示。

补充说明

  • format_html是Django提供的安全生成HTML的方法,避免直接拼接HTML带来的XSS攻击风险。
  • obj.image.url会根据你配置的MEDIA_URL自动生成图片的访问路径,比如图片存储在media/product/xxx.jpg,则访问URL为/media/product/xxx.jpg。

内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:25:44