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

如何修改Django Admin中模型的默认展示分组位置?

修改Django Admin中模型的默认分组位置

要把Group、Permission这类默认归属于“Authentication and authorization”分组的模型,移到自定义的用户相关分组下,且不想继承原模型,可通过以下几种方法实现:

方法一:使用代理模型(推荐)

代理模型(Proxy Model)是Django官方支持的模式,仅封装原模型逻辑,不会创建新数据库表,完全满足不修改原模型的需求:

from django.contrib.auth.models import Group, Permission
from django.contrib import admin

# 为Group创建代理模型
class CustomGroup(Group):
    class Meta:
        proxy = True
        verbose_name = Group._meta.verbose_name
        verbose_name_plural = Group._meta.verbose_name_plural
        app_label = 'your_user_app'  # 替换为你的用户相关应用的app_label

# 为Permission创建代理模型
class CustomPermission(Permission):
    class Meta:
        proxy = True
        verbose_name = Permission._meta.verbose_name
        verbose_name_plural = Permission._meta.verbose_name_plural
        app_label = 'your_user_app'

# 注册代理模型
class GroupAdmin(admin.ModelAdmin):
    filter_horizontal = ('permissions',)

admin.site.unregister(Group)
admin.site.register(CustomGroup, GroupAdmin)

admin.site.unregister(Permission)
admin.site.register(CustomPermission)

方法二:临时修改模型的app_label(不推荐)

直接修改模型的_meta.app_label属性,会全局改变模型的应用归属,可能影响其他依赖该标识的功能,谨慎使用:

from django.contrib.auth.models import Group, Permission
from django.contrib import admin

# 修改Group的应用归属
Group._meta.app_label = 'your_user_app'
# 修改Permission的应用归属
Permission._meta.app_label = 'your_user_app'

# 重新注册模型
class GroupAdmin(admin.ModelAdmin):
    filter_horizontal = ('permissions',)

admin.site.unregister(Group)
admin.site.register(Group, GroupAdmin)

admin.site.unregister(Permission)
admin.site.register(Permission)

方法三:自定义AdminSite(灵活适配复杂场景)

通过重写AdminSite的get_app_list方法,在Admin层面重新组织分组,无需修改模型或创建代理:

from django.contrib.admin import AdminSite
from django.contrib.auth.models import Group, Permission
from django.contrib.auth.admin import GroupAdmin, PermissionAdmin
from django.contrib import admin

class CustomAdminSite(AdminSite):
    def get_app_list(self, request):
        app_list = super().get_app_list(request)
        target_app_label = 'your_user_app'
        target_app_name = '用户管理'  # 自定义分组显示名称

        # 查找或创建目标分组
        target_app = next((app for app in app_list if app['app_label'] == target_app_label), None)
        if not target_app:
            target_app = {
                'app_label': target_app_label,
                'app_name': target_app_name,
                'models': []
            }
            app_list.append(target_app)

        # 处理auth分组中的Group和Permission
        auth_app = next((app for app in app_list if app['app_label'] == 'auth'), None)
        if auth_app:
            # 筛选并移动目标模型
            models_to_move = []
            for model in auth_app['models']:
                if model['object_name'] in ('Group', 'Permission'):
                    models_to_move.append(model)
            # 从auth分组移除,添加到目标分组
            for model in models_to_move:
                auth_app['models'].remove(model)
                target_app['models'].append(model)
            # 若auth分组无剩余模型,移除该分组
            if not auth_app['models']:
                app_list.remove(auth_app)

        # 对目标分组内的模型排序(可选)
        target_app['models'].sort(key=lambda x: x['name'])
        return app_list

# 替换默认Admin站点
admin.site = CustomAdminSite(name='admin')

# 重新注册所有必要模型
admin.site.register(Group, GroupAdmin)
admin.site.register(Permission, PermissionAdmin)
# 注册你的其他用户相关模型(如自定义User模型)
# from .models import User
# admin.site.register(User)

各方法对比

  • 代理模型:安全稳定,无全局副作用,是官方推荐的最佳实践。
  • 临时修改app_label:实现简单,但存在全局风险,仅适合测试或简单场景。
  • 自定义AdminSite:灵活性最高,适合需要深度定制Admin布局的场景,代码量稍大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:08:11