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

能否自定义Django 3 admin导航侧边栏菜单为自定义分组?

Django 3 自定义admin左侧导航侧边栏解决方案

Django admin左侧侧边栏的内容由app_list变量控制,这个变量默认是AdminSite调用get_app_list方法生成的,包含所有已注册的App和对应用户有权限访问的模型。你只需要修改这个方法的返回值,就能自定义分组和模型列表。


方法1:重写AdminSite的get_app_list方法(推荐,无需修改模板)

这个方法所有逻辑都在后端控制,天然适配Django原生的权限、模型排序规则,不需要改动模板代码。

  1. 在你的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)
  1. 修改项目根目录的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,可以通过覆盖模板的方式修改:

  1. 在项目templates目录下新建路径admin/nav_sidebar.html
  2. 复制Django原生nav_sidebar.html的内容到上述文件,修改其中遍历app_list的逻辑,自行过滤模型和分组即可。

补充说明

  • 如果需要针对不同角色展示不同的侧边栏内容,直接在get_app_list方法中通过request.user做权限判断即可,适配原生权限体系。
  • 单个模型的显示名称可以在模型的Meta类中设置verbose_name修改,不需要修改侧边栏逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:45:03