Django Admin中如何将外键关联的自定义属性字段加入详情页fields?
解决Django Admin详情页显示自定义属性/外键关联字段的问题
这个报错的原因很清晰:Django Admin的fields配置只认模型中实际存在的数据库字段,而你定义的custom_field是Python的@property动态属性,不属于数据库存储的字段,直接加到fields里自然会提示找不到字段。
下面给你两种可行的解决方案,按需选择:
方案1:直接引用外键关联字段(推荐)
如果你的custom_field只是返回外键bookingid的username,完全不需要额外定义property,直接用Django的跨关系字段引用语法(双下划线__)就能在详情页展示关联内容:
class MyAdmin(ReadOnlyAdminFields, admin.ModelAdmin): # 列表页配置保持不变 list_display = ('custom_field', 'name') readonly = ('custom_field', 'name') # 直接通过外键关联语法调用目标字段 fields = ('bookingid__username', 'name')
方案2:用readonly_fields加载自定义属性
如果custom_field有更复杂的计算逻辑,必须保留这个property,那么可以把它放到readonly_fields中(这个配置支持方法/动态属性),同时fields只放模型实际存在的数据库字段,也可以结合使用:
class MyAdmin(ReadOnlyAdminFields, admin.ModelAdmin): list_display = ('custom_field', 'name') # 将自定义属性加入只读字段配置 readonly_fields = ('custom_field', 'name') # fields里仅存放模型真实存在的数据库字段 fields = ('name',) # 也可以用fieldsets分组展示,效果更清晰: # fieldsets = ( # (None, { # 'fields': ('name',), # 'readonly_fields': ('custom_field',) # }), # )
这么配置后,详情页就能正常显示custom_field的内容了。核心逻辑是:readonly_fields的设计目的就是展示无需编辑、动态生成的内容,而fields仅负责可编辑(或指定展示)的数据库字段。
内容的提问来源于stack exchange,提问作者Aman Patel
相关产品推荐
相关产品推荐

