django admin图片上传回显

这个问题其实就是compute字段如何显示在django admin的编辑表单中。由于django admin默认只会显示model中editable=true的属性,所以计算字段需要特殊处理。

最开始是在model中直接定义了一个自定义方法属性image_data。

class Product(models.Model):
    # ... other fields
    image = models.ImageField(u'图片', upload_to='photos/%Y/%m/%d')
    def image_data(self, obj):
        return mark_safe(u'< img src="%s" width="100px" />' % obj.image.url)
    # 页面显示的字段名称
    image_data.short_description = u'品牌图片'

# 在admin.py中定义模型对应的admin展示方式
class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'image_data')
    readonly_fields = ('image_data',)  #必须加这行 否则访问编辑页面会报错

以上这种方式可以在列表中正常显示上传的图片,但是在编辑表单中图片对应的字段只会显示一个label,内容不会显示出来。

经过google找到解决办法:

class Product(models.Model):
    # ... other fields
    image = models.ImageField(u'图片', upload_to='photos/%Y/%m/%d')

# 在admin.py中定义模型对应的admin展示方式
from django.utils.safestring import mark_safe
class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'image_data')
    readonly_fields = ('image_data',)  #必须加这行 否则访问编辑页面会报错
    def image_data(self, obj):
        return mark_safe(u'< img src="%s" width="100px" />' % obj.image.url)
    # 页面显示的字段名称
    image_data.short_description = u'品牌图片'

看到这里应该清楚了吧,其实很简单只要将model中的自定义方法字段移到modelAdmin中即可。
注意:文章中的< img src="%s" width="100px" /> 故意在“<”后多加了空格 否则简书的编辑器会自动转义掉,大家写代码的时候要去掉否则会报错。(感谢P_sky的提醒)

推荐阅读更多精彩内容