如何在Django默认用户页面添加多对多关联的Website Tabular Inline
解决Django用户管理页面多对多关联网站的问题
报错原因
你尝试用TabularInline直接关联Website模型,但Django的TabularInline要求关联模型必须包含指向父模型(User)的ForeignKey,而Website与User是多对多关系,没有直接外键,因此触发admin.E202错误。
解决方案
方案一:用Filter控件直接管理(最简单)
在UserAdmin中添加filter_horizontal字段,直接在用户编辑页面生成直观的多对多选择控件:
class UserAdmin(admin.ModelAdmin): # 生成左右选择的多对多控件,反向关联名为website_set filter_horizontal = ('website_set',) admin.site.unregister(User) admin.site.register(User, UserAdmin)
这样编辑用户时,就能直接查看、添加或移除关联的网站。
方案二:用多对多中间表的Inline(适合需要扩展中间表的场景)
如果后续需要给多对多关系添加额外字段,或偏好Inline展示形式,可指定多对多的中间模型作为Inline的关联对象:
class WebsiteInline(admin.TabularInline): # 指定多对多关系的中间表 model = Website.users.through extra = 1 verbose_name = "关联网站" verbose_name_plural = "关联网站列表" # 自定义显示字段,只展示网站URL(需确保Website的__str__返回URL) fields = ('website',) class UserAdmin(admin.ModelAdmin): inlines = [WebsiteInline] admin.site.unregister(User) admin.site.register(User, UserAdmin)
内容的提问来源于stack exchange,提问作者Alin
相关产品推荐
相关产品推荐

