這個(gè)問題其實(shí)就是compute字段如何顯示在django admin的編輯表單中。由于django admin默認(rèn)只會(huì)顯示model中editable=true的屬性,所以計(jì)算字段需要特殊處理。
最開始是在model中直接定義了一個(gè)自定義方法屬性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中定義模型對(duì)應(yīng)的admin展示方式
class ProductAdmin(admin.ModelAdmin):
list_display = ('name', 'image_data')
readonly_fields = ('image_data',) #必須加這行 否則訪問編輯頁面會(huì)報(bào)錯(cuò)
以上這種方式可以在列表中正常顯示上傳的圖片,但是在編輯表單中圖片對(duì)應(yīng)的字段只會(huì)顯示一個(gè)label,內(nèi)容不會(huì)顯示出來。
經(jīng)過google找到解決辦法:
class Product(models.Model):
# ... other fields
image = models.ImageField(u'圖片', upload_to='photos/%Y/%m/%d')
# 在admin.py中定義模型對(duì)應(yīng)的admin展示方式
from django.utils.safestring import mark_safe
class ProductAdmin(admin.ModelAdmin):
list_display = ('name', 'image_data')
readonly_fields = ('image_data',) #必須加這行 否則訪問編輯頁面會(huì)報(bào)錯(cuò)
def image_data(self, obj):
return mark_safe(u'< img src="%s" width="100px" />' % obj.image.url)
# 頁面顯示的字段名稱
image_data.short_description = u'品牌圖片'
看到這里應(yīng)該清楚了吧,其實(shí)很簡(jiǎn)單只要將model中的自定義方法字段移到modelAdmin中即可。
注意:文章中的< img src="%s" width="100px" /> 故意在“<”后多加了空格 否則簡(jiǎn)書的編輯器會(huì)自動(dòng)轉(zhuǎn)義掉,大家寫代碼的時(shí)候要去掉否則會(huì)報(bào)錯(cuò)。(感謝P_sky的提醒)