django 修改model field后台默认的显示方式

我们都知道django模型在后台有默认的显示方式,它的显示是靠widget(不了解widget参考:https://docs.djangoproject.com/en/dev/ref/forms/widgets/)这种方式,所以要修改feild的默认显示方式,需要自定义widget,下面是一个自定义ImageField的widget

django默认的ImageField在后台显示的是image的url,我们更希望看到image的thumbnail,那要怎么做呢:

1、model

class RecommendApp(models.Model):
    slider_image=models.ImageField('幻灯截图',upload_to="slider",null=True,blank=True)

2、在widget.py中自定义imageWidget

#coding=utf8
from django.forms.widgets import ClearableFileInput,CheckboxInput
from django.utils.html import escape, conditional_escape
from django.utils.encoding import StrAndUnicode, force_unicode
from django.utils.safestring import mark_safe

class ImageWidget(ClearableFileInput):
    def render(self, name, value, attrs=None):
        substitutions = {
            'initial_text': self.initial_text,
            'input_text': self.input_text,
            'clear_template': '',
            'clear_checkbox_label': self.clear_checkbox_label,
        }
        template = u'%(input)s'
        substitutions['input'] = super(ClearableFileInput, self).render(name, value, attrs)

        if value and hasattr(value, "url"):
            template = self.template_with_initial
            substitutions['initial'] = (u'<a href="%s" target="_blank"><img width="100px" height="100px" src="%s"></a>'
                                        % (escape(value.url),
                                           escape(value.url)))
            if not self.is_required:
                checkbox_name = self.clear_checkbox_name(name)
                checkbox_id = self.clear_checkbox_id(checkbox_name)
                substitutions['clear_checkbox_name'] = conditional_escape(checkbox_name)
                substitutions['clear_checkbox_id'] = conditional_escape(checkbox_id)
                substitutions['clear'] = CheckboxInput().render(checkbox_name, False, attrs={'id': checkbox_id})
                substitutions['clear_template'] = self.template_with_clear % substitutions

        return mark_safe(template % substitutions)

3、在admin.py中添加自定义widget

class RecommendAppAdmin(admin.ModelAdmin):
    # formfield_overrides = {models.ImageField: {'widget': ImageWidget}}  #给当前模型所有ImageField字段添加widget

    # 仅给slider_image字段添加widget
    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name=='slider_image':
            kwargs['widget']=ImageWidget
            try:
                del kwargs['request']
            except KeyError:
                pass
            return db_field.formfield(**kwargs)
        return super(RecommendAppAdmin, self).formfield_for_dbfield(db_field, **kwargs)
admin.site.register(RecommendApp,RecommendAppAdmin);

通过上面这3步就能在后台看到image的缩略图了。

 

如果你想修改多对多字段的显示方式,可以看我的这篇文章https://blog.csdn.net/bocai_xiaodaidai/article/details/95172133

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值