這個問題其實就是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的提醒)