Django 2+Python3:如何在User后台编辑页只读展示关联应用列表?
解决Django后台User编辑页只读展示关联应用列表的问题
嘿,我来帮你搞定这个需求!你遇到的问题是因为applications是反向关联的管理器,并不是User模型本身的数据库字段,所以直接在fieldsets里引用会报错。下面是具体的解决方案:
核心思路
我们需要在UserAdmin中定义一个自定义方法,用来获取并格式化当前用户的所有StoreApplication名称,然后把这个方法作为只读字段添加到后台编辑页里。
完整代码示例
首先,修改你的UserAdmin类:
from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.utils.safestring import mark_safe from .models import User, StoreApplication class UserAdmin(BaseUserAdmin): # 重写fieldsets,添加展示应用列表的区块 fieldsets = ( (None, {'fields': ('username', 'password')}), ('Personal Info', {'fields': ('first_name', 'last_name', 'email')}), ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}), ('Important Dates', {'fields': ('last_login', 'date_joined')}), # 新增的区块,用来展示应用列表 ('Store Applications', {'fields': ('get_user_applications',)}), ) # 把自定义方法加入只读字段列表 readonly_fields = ('get_user_applications',) def get_user_applications(self, obj): # 获取当前用户的所有应用,提取名称 app_list = obj.applications.all() if not app_list.exists(): return "No store applications found." # 用HTML无序列表格式化输出,让展示更清晰 html_items = [f'<li>{app.name}</li>' for app in app_list] html_list = f'<ul>{"".join(html_items)}</ul>' # 标记为安全HTML,避免后台转义标签 return mark_safe(html_list) # 设置这个字段在后台的显示名称 get_user_applications.short_description = "Associated Store Applications" # 注册User和StoreApplication模型 admin.site.register(User, UserAdmin) admin.site.register(StoreApplication)
关键细节说明
为什么不能直接用
applications?applications是Django自动生成的反向关联管理器,它不属于User模型的数据库字段,所以无法直接在fieldsets中引用,这就是你看到Unknown field(s) (applications)错误的原因。自定义方法的作用
get_user_applications方法接收当前User对象obj,通过obj.applications.all()获取所有关联的StoreApplication。- 用HTML列表格式化输出,让展示更直观;如果不需要HTML,也可以用逗号分隔的文本,比如
", ".join([app.name for app in app_list])。 mark_safe用来告诉Django这段HTML是安全的,不会被转义成纯文本。
适配你的模型字段
如果你的StoreApplication模型中,应用名称的字段不是name,记得把代码里的app.name替换成实际的字段名(比如app.title)。
这样修改后,你在User的后台编辑页就能看到一个只读的区块,清晰展示该用户所有的StoreApplication名称啦!
内容的提问来源于stack exchange,提问作者Leogout
相关产品推荐
相关产品推荐

