在Django Admin用户修改表单中展示非模型字段的外部链接图片
问题原因说明
- 自定义ModelForm未生效:
BaseUserAdmin内置了预设的fieldsets配置,优先级高于ModelForm的Meta.fields,仅指定form属性不会覆盖原有字段展示规则。 - 自定义方法加入fieldsets报错:fieldsets默认仅接受模型/表单字段,非字段的自定义方法需要先加入
readonly_fields配置才能被正常识别渲染。
实现方案
你已经在模型层定义了image方法,仅需修改UserAdmin配置即可实现需求:
@admin.register(User) class UserAdmin(BaseUserAdmin): # 保留原有配置,比如列表页展示字段 list_display = ('image',) + BaseUserAdmin.list_display # 第一步:把自定义image方法加入只读字段 readonly_fields = ('image',) + BaseUserAdmin.readonly_fields # 第二步:修改fieldsets,把image放到用户名、密码字段下方 fieldsets = ( (None, { # 按你需要的顺序排布字段,image放在password之后即可 "fields": ("username", "password", "image",) }), # 保留BaseUserAdmin原有的其他配置(个人信息、权限、重要日期等区块) *BaseUserAdmin.fieldsets[1:] )
如果不想把image方法耦合在模型层,也可以直接定义在UserAdmin类内部,效果完全一致:
@admin.register(User) class UserAdmin(BaseUserAdmin): list_display = ('image',) + BaseUserAdmin.list_display readonly_fields = ('image',) + BaseUserAdmin.readonly_fields fieldsets = ( (None, { "fields": ("username", "password", "image",) }), *BaseUserAdmin.fieldsets[1:] ) # Admin层内部定义image方法 def image(self, obj): from django.utils.safestring import mark_safe from django.utils.translation import gettext as _ # 这里可以根据obj的用户信息动态拼接外部图片地址 return mark_safe('<img src="http://onlinesource.com/image.png" width=200 height=200 alt="image" />') image.short_description = _('Image')
内容的提问来源于stack exchange,提问作者legenddaniel
相关产品推荐
相关产品推荐

