如何在Django中配置panel模块的多级嵌套子路由
Django面板模块嵌套路由配置方案
要实现site.com/panel/user/id/profile、site.com/panel/admin/id/addItem这类分层路由,核心是用Django的include()方法做路由层级拆分,不要把所有路由平铺在同一个路由列表里。
原有配置的问题
- URL路径里写了
user dashboard这类带空格的字段,不符合URL规范,访问时会被转义,极易出错 - 子路由没有挂载到user、admin的分组前缀下,也没有绑定ID路径参数
- 代码漏导入了
adminPanel视图和路由嵌套需要的include方法
配置步骤
1. 根路由(ecoverde/urls.py)无需修改
原有根路由逻辑是正确的,已经把/panel/前缀的请求转发到panel应用的路由文件,保留原有代码即可:
from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), path('', include('base.urls')), path('panel/', include('panel.urls')), ] urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
2. 重写panel应用路由(ecoverde/panel/urls.py)
把user、admin两个分组的子路由单独定义,再通过include()挂载到对应前缀下,父级路径定义的<str:pk>参数会自动传递给所有子路由的视图函数:
from django.urls import path, include # 导入所有需要用到的视图,记得补全你自己的子页面视图 from .views import userPanel, adminPanel, Compare, saves, profile, addItem # 用户端子路由,自动继承前缀 /panel/user/<str:pk>/ user_panel_routes = [ path('', userPanel, name='userPanel'), # 对应用户面板首页 /panel/user/<pk>/ path('profile/', profile, name='userProfile'), # 对应需求路径 /panel/user/<pk>/profile path('compare/', Compare, name='compare'), path('saves/', saves, name='saves'), # 后续新增用户端子路由直接加在这个列表里即可 ] # 管理员端子路由,自动继承前缀 /panel/admin/<str:pk>/ admin_panel_routes = [ path('', adminPanel, name='adminPanel'), # 对应管理员面板首页 /panel/admin/<pk>/ path('addItem/', addItem, name='adminAddItem'), # 对应需求路径 /panel/admin/<pk>/addItem # 后续新增管理员端子路由直接加在这个列表里即可 ] urlpatterns = [ path('user/<str:pk>/', include(user_panel_routes)), path('admin/<str:pk>/', include(admin_panel_routes)), ]
配置注意事项
- 所有路径末尾统一加斜杠,匹配Django默认的
APPEND_SLASH规则,避免不必要的301跳转 - 子路由绑定的视图函数必须接收父级传递的
pk参数,例如profile视图的定义格式为def profile(request, pk):,否则会报参数不匹配错误 - 如果后续子路由数量过多,可以把
user_panel_routes、admin_panel_routes拆成单独的路由文件(比如panel/urls_user.py、panel/urls_admin.py),挂载时直接写path('user/<str:pk>/', include('panel.urls_user'))即可,逻辑完全一致 - 模板里反向解析路由时,直接传入pk参数即可,例如
{% url 'userProfile' pk=request.user.id %}会自动生成正确的访问路径
内容的提问来源于stack exchange,提问作者Manny
相关产品推荐
相关产品推荐

