如何添加自定义Django admin站点且无需给每个URL模式重复加前缀
错误原因
该报错是自定义Django Admin站点的路由反向解析规则不匹配导致的:
自定义AdminSite内部的视图(比如首页的应用列表路由app_list)默认会使用默认Admin的命名空间反向解析路径,你把foo-admin/前缀抽到根路由用include导入后,自定义Admin的所有路由都被嵌套在foo-admin/路径下,但你没有同步修改自定义Admin站点的配置,导致它反向解析路由时还是去找默认/admin/前缀下的路径,最终匹配失败。
修复方案
方案1(推荐):单独声明自定义Admin路由
把自定义Admin的路由和应用普通业务路由拆分,直接在根urls.py中配置前缀:
- 根urls.py修改如下:
from my_app.admin import my_app_admin_site # 导入你自定义的Admin站点实例 urlpatterns = [ path('admin/', admin.site.urls), # 单独配置自定义Admin的前缀 path('foo-admin/', my_app_admin_site.urls), # 应用普通业务路由单独导入 path('', include('my_app.urls')), ]
- 在自定义Admin实例的定义文件(一般为
my_app/admin.py)中添加根路径配置:
# 假设你的自定义Admin实例是这么定义的,添加site_url配置 my_app_admin_site = admin.AdminSite(name='my_app_admin') my_app_admin_site.site_url = '/foo-admin/'
my_app/urls.py中删除自定义Admin的路由,仅保留普通业务路由即可:
urlpatterns = [ path('foo/', views.some_view), path('foo/bar/<slug>/', views.MyGenericView.as_view()), ]
方案2:保留当前路由结构的修复方法
如果你一定要把自定义Admin路由放在应用urls.py里统一用include导入,按以下步骤修改:
- 在自定义Admin实例的定义中指定独立命名空间:
my_app_admin_site = admin.AdminSite(name='my_app_admin')
- 如果你有模板或代码中硬编码了
{% url 'admin:xxxx' %}这类反向解析语句,需要统一替换为{% url 'my_app_admin:xxxx' %}。
内容的提问来源于stack exchange,提问作者everspader
相关产品推荐
相关产品推荐

