Django admin 显示图片

我有一个表用来储存轮播图片,有一个 `picture` 字段储存的是图片的url,图片的 url 通过上传文件到 cdn 获得。目前这个表的编辑是通过自定义一个 `ModelForm`,然后重写 Django admin 逻辑将文件上传到 cdn 获取地址后,储存到数据库。

# 自定义表单
class PuzzleImgForm(forms.ModelForm):
    picture = forms.FileField(label='图片', required=False)

# 覆盖 Django admin 代码
def get_form(self, request, obj=None, **kwargs):
   return PuzzleImgForm

# 数据表只储存图片链接
picture = models.CharField("图片url", max_length=2048, null=True, blank=True)

  

现在,遇到一个问题,修改图片的时候看不到图片的样子,只能看到 url,不够直观。于是我就搜索 `django admin form show image`。发现一个答案比较简洁,尝试并修改了部分,成功了。

def image_img(self):
    if self.image:
        return marksafe('<img src="%s" />' % self.image_url)
    else:
        return '(no image)'

image_img.short_description = 'Thumb'

# and in your admin.py add:
list_display= ('image_img','product',)
readonly_fields = ('image_img',)

#and for adding it in the 'Edit mode' of your admin panel in your admin.py add:
fields = ( 'image_img', )

我这里的问题是,使用 fields 会覆盖自定义的表单,admin 页面上只出现一个 image_img 字段。如果删除 fields,将 `image_img` 加入 `ist_display`,那么 `image_img` 不会出现。最后我将其放入 `readonly_fields` 才生效。

我的思考

关于重写 Django admin

能使用大部分 Django 已有的功能,只需要重写少部分排版与筛选。覆盖 Django 源码可能会很麻烦。

关于Django 用法

`list_display` 与 `fields` 有什么区别?

关于向下兼容与重构

 我们写代码的时候,看到之前的代码,想的更多是重构掉,而不是向下兼容,因为往往之前的代码存在各种问题,保持继续兼容反而会更难受。比如 python2 的编码问题,python3 就彻底不同,从 ASCII 改为 UNICODE。我认为,保持兼容是要之前的代码立意、逻辑正确,才有意义。但是,一开始写代码,一些情况、需求往往和之后的会不一样,这种情况要怎么处理?

原文地址:https://www.cnblogs.com/jay54520/p/6209059.html