这个问题其实就是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的提醒)