如何修改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
相关产品推荐
相关产品推荐

