You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键细节说明

  1. 为什么不能直接用applications?

    applications是Django自动生成的反向关联管理器,它不属于User模型的数据库字段,所以无法直接在fieldsets中引用,这就是你看到Unknown field(s) (applications)错误的原因。

  2. 自定义方法的作用

    • get_user_applications方法接收当前User对象obj,通过obj.applications.all()获取所有关联的StoreApplication。
    • 用HTML列表格式化输出,让展示更直观;如果不需要HTML,也可以用逗号分隔的文本,比如", ".join([app.name for app in app_list])。
    • mark_safe用来告诉Django这段HTML是安全的,不会被转义成纯文本。
  3. 适配你的模型字段
    如果你的StoreApplication模型中,应用名称的字段不是name,记得把代码里的app.name替换成实际的字段名(比如app.title)。

这样修改后,你在User的后台编辑页就能看到一个只读的区块,清晰展示该用户所有的StoreApplication名称啦!

内容的提问来源于stack exchange,提问作者Leogout

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:33:54