能否自定义Django 3 admin导航侧边栏菜单为自定义分组?
Django 3 自定义admin左侧导航侧边栏解决方案
Django admin左侧侧边栏的内容由app_list变量控制,这个变量默认是AdminSite调用get_app_list方法生成的,包含所有已注册的App和对应用户有权限访问的模型。你只需要修改这个方法的返回值,就能自定义分组和模型列表。
方法1:重写AdminSite的get_app_list方法(推荐,无需修改模板)
这个方法所有逻辑都在后端控制,天然适配Django原生的权限、模型排序规则,不需要改动模板代码。
- 在你的App的
admin.py文件中定义自定义AdminSite类,重写get_app_list方法构造你要的结构:
from django.contrib.admin import AdminSite # 导入你需要展示的模型 from app_a.models import ModelA1 from app_b.models import ModelB1 class CustomAdminSite(AdminSite): # 可自定义后台名称,不需要可以删除 site_header = "管理后台" site_title = "管理后台" def get_app_list(self, request): # 先调用父类方法获取原始数据,自动处理权限、模型排序等原生逻辑 origin_app_list = super().get_app_list(request) # 定义你的自定义分组 custom_group = { "name": "Custom name", # 替换为你要的自定义分组名称 "app_label": "custom_group", # 任意唯一标识即可 "models": [] } # 从原始列表中筛选你需要的模型 for app in origin_app_list: for model in app["models"]: # 按模型类名匹配,替换成你自己的模型名 if model["object_name"] in ["ModelA1", "ModelB1"]: custom_group["models"].append(model) # 构造最终返回的侧边栏列表 final_app_list = [] if custom_group["models"]: final_app_list.append(custom_group) # 如果你需要保留原有的其他App分组,把下行注释取消即可 # final_app_list += origin_app_list return final_app_list # 实例化自定义后台站点 admin_site = CustomAdminSite(name="custom_admin") # 注册你要用到的所有模型到自定义站点 admin_site.register(ModelA1) admin_site.register(ModelB1)
- 修改项目根目录的
urls.py,替换默认的admin路由:
from django.urls import path # 导入你上面定义的自定义admin实例 from your_app.admin import admin_site urlpatterns = [ # 替换原有默认admin路由 path("admin/", admin_site.urls), ]
方法2:覆盖侧边栏模板(适合不修改AdminSite的场景)
如果你不想替换默认的AdminSite,可以通过覆盖模板的方式修改:
- 在项目
templates目录下新建路径admin/nav_sidebar.html - 复制Django原生
nav_sidebar.html的内容到上述文件,修改其中遍历app_list的逻辑,自行过滤模型和分组即可。
补充说明
- 如果需要针对不同角色展示不同的侧边栏内容,直接在
get_app_list方法中通过request.user做权限判断即可,适配原生权限体系。 - 单个模型的显示名称可以在模型的
Meta类中设置verbose_name修改,不需要修改侧边栏逻辑。
内容的提问来源于stack exchange,提问作者esduren
相关产品推荐
相关产品推荐

