如何梳理Django项目URL?解决{% url %}反向解析路径异常问题
我是Django初学者,跟着YouTube视频和Django文档创建了项目和signin应用,制作了登录、注册、商家注册的HTML页面。
现有代码配置
project/urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), #website.com/admin/ path('', include('signin.urls')), #website.com/ path('home/', include('signin.urls')), #website.com/home/ path('signin/', include('signin.urls')), #website.com/signin/ path('signup/', include('signin.urls')), #website.com/signup/ path('business_signup/', include('signin.urls')), #website.com/business_signup/ ]
signin/urls.py
from django.urls import path from . import views urlpatterns = [ path('', views.default, name='signin'), path('home/', views.default, name='home'), path('signin/', views.default, name='signin'), path('signup/', views.signup, name='signup'), path('business_signup/', views.business_signup, name='business_signup'), ]
signin/views.py
from django.shortcuts import render from django.http import HttpResponse # Create your views here. def default(request): return render(request, "default.htm")
问题现象
HTML页面中使用硬编码路径<p>New here? <a href="/signup">Create an account</a></p>时,所有URL均可正常跳转;但使用Django模板URL标签<p>New here? <a href="{% url 'signup' %}">Create an account</a></p>时,生成的跳转路径变成http://127.0.0.1:8000/business_signup/signin/、http://127.0.0.1:8000/business_signup/signup/这类嵌套异常路径,期望生成http://127.0.0.1:8000/signin/这类根路径下的URL。
解决方法
1. 重构项目URL配置,避免重复挂载应用URL
当前project/urls.py多次将signin.urls挂载到不同根路径,导致Django反向解析时匹配混乱——同一个命名URL会对应多个挂载路径,模板解析时会优先匹配最后一次挂载的路径(如/business_signup/),进而拼接出嵌套路径。
修改project/urls.py,仅保留一次应用URL挂载:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), # 仅挂载一次,应用内URL自动拼接在根路径后 path('', include('signin.urls')), ]
2. 调整应用内URL配置,保证命名唯一、路径清晰
当前signin/urls.py存在重复的name='signin',会引发反向解析冲突,同时调整路径定义:
from django.urls import path from . import views urlpatterns = [ # 空路径跳转至登录页 path('', views.default, name='home'), # 登录页独立路径 path('signin/', views.default, name='signin'), # 普通用户注册路径 path('signup/', views.signup, name='signup'), # 商家注册路径 path('business_signup/', views.business_signup, name='business_signup'), ]
3. 模板中正常使用URL标签
修改配置后,模板中的{% url 'signup' %}会正确解析为/signup/,{% url 'signin' %}解析为/signin/,符合根路径跳转需求。
内容的提问来源于stack exchange,提问作者Dibya Prakash Dash

