部分参考:
狂奔的虾米https://www.jianshu.com/p/ea7cb7c44a1e
无名小妖https://www.cnblogs.com/wumingxiaoyao/p/6928297.html
今天在写django 的 admin后台时,发现一个问题啊,
后台的图片是以url的形式展示的,看起来很不直观啊,要怎么改变它呢?
在简书找到了一个办法:
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
@admin.register(Product)
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中:
job_pic = models.CharField(verbose_name='兼职图片',max_length=100)
别问我为什么要用CharField来保存图片,再自己把文件写入media路径下这么麻烦。。。
自己造的孽,自己填,业务代码不方便展示,仿照上面的代码,CharField的话这么写:
# models.py:
from django.utils.html import format_html
class Product(models.Model):
# ... other fields
image_url = models.CharField(verbose_name='图片',max_length=100)
def image_data(self):
return format_html(
'',
self.image_url,
)
image_data.short_description = u'图片'
# admin.py:
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ('name', 'image_data')
对的,没错,就是这么简单!
现在访问admin,你惊讶的发现有图了。
其实ImageField的话, 也可以不按我转的那个那样写,可以这么写:
from django.utils.html import format_html
class Product(models.Model):
# ... other fields
image = models.ImageField(u'图片', upload_to='photos/%Y/%m/%d')
def image_data(self):
return format_html(
'',
self.image.url,
)
image_data.short_description = u'图片'
# admin.py:
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ('name', 'image_data')
readonly_fields = ('image_data',)
是不是差不多?
相信机智的你一定领悟了怎么覆写admin界面了吧~
–补充说明:
short_description为设置标题
readonly_fields为设置该列不可编辑