Django访问/home路径报NoReverseMatch反向路由匹配错误
问题描述
访问localhost:8000/home时,PowerShell输出如下报错:
django.urls.exceptions.NoReverseMatch: Reverse for 'register' not found. 'register' is not a valid view function or pattern name.
涉及的代码片段如下:
- 导航栏模板代码:
<section> <nav class="navbar navbar-expand-lg bg-dark navbar-dark "> <!-- Container wrapper --> <div class="container-fluid justify-content-center"> <!-- Navbar brand --> <a class="navbar-brand" href="{% url 'home_page' %}"> Turbine Power Web</a> <div class="collapse navbar-collapse" id="navbarResponsive"> <ul class="navbar-nav ms-auto"> {% if user.is_authenticated %} <li class="nav-item"><a class="nav-link" href="{% url 'accounts:logout' %}">Logout</a></li> <li class="nav-item"><a class="nav-link" href="{% url 'accounts:password_change' %}">Change Password</a></li> {% else %} <li class="nav-item"><a class="nav-link" href="{% url 'accounts:login' %}">Login</a></li> <li class="nav-item"><a class="nav-link" href="{% url 'accounts:user-registration' %}">Register</a></li> {% endif %} <li class="nav-item"><a class="nav-link" href="">Turbine Models</a></li> <li class="nav-item"><a class="nav-link" href="">Author</a></li> {% if user.is_company %} <li class="nav-item"><a class="nav-link" href="">My Models</a></li> {% endif %} <li class="nav-item"> Hello, {{ user.username|default:'Guest' }} </li> </ul> </div> </div> </nav> <!-- Navbar --> </section>
- home页视图代码:
def home_page(request): return render(request, 'turbineweb/home_page.html')
- 项目根urls.py配置:
urlpatterns = [ path('admin/', admin.site.urls), path('', include('accounts.urls', namespace='accounts')), path('', include('turbineweb.urls')), ]
- accounts应用urls.py配置:
app_name = 'accounts' urlpatterns = [ path('login/', CustomLoginView.as_view(redirect_authenticated_user=True, template_name='accounts/login.html', authentication_form=LoginForm), name='login'), path('logout/', auth_views.LogoutView.as_view(template_name='accounts/logout.html'), name='logout'), path('registration/', RegisterView.as_view(), name='users-registration'), path('password-change/', ChangePasswordView.as_view(), name='password_change'), path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'), path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'), path('reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'), path('reset/done/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'), ]
- turbineweb应用urls.py配置:
app_name = 'turbineweb' urlpatterns = [ path('home/', views.home_page, name='home_page'), ]
错误截图:
故障原因
报错本质是Django反向路由解析时,找不到模板中引用的路由名,具体有3个配置不匹配问题:
- 注册路由名引用错误
- accounts应用中注册视图的路由
name定义为users-registration,带命名空间的完整路由名应为accounts:users-registration - 现有模板中注册链接写的是
accounts:user-registration(user为单数,和定义的复数users不一致);报错提示找不到register,说明实际渲染的模板中还有位置直接写了{% url 'register' %},既没有加accounts命名空间前缀,也和所有已定义的路由名不匹配。
- accounts应用中注册视图的路由
- 首页路由名引用错误
- turbineweb应用设置了
app_name = 'turbineweb',该应用下home_page路由的完整名称应为turbineweb:home_page - 模板中首页链接写的是
{% url 'home_page' %},缺少命名空间前缀,无法被Django解析。
- turbineweb应用设置了
- 根路由include配置不规范
根urls.py中引入turbineweb路由时没有显式指定namespace,容易在多应用路由重名时出现解析异常。
修复方案
按以下步骤修改即可解决:
- 修正模板中所有反向路由引用
全局搜索所有模板文件,把所有{% url 'register' %}的写法统一替换为正确的注册路由地址;修正导航栏中的两处错误路由引用,修改后的核心代码如下:<!-- 首页链接修正命名空间 --> <a class="navbar-brand" href="{% url 'turbineweb:home_page' %}"> Turbine Power Web</a> ... <!-- 注册链接修正路由名,和urls.py中定义的name完全一致 --> <li class="nav-item"><a class="nav-link" href="{% url 'accounts:users-registration' %}">Register</a></li> - 补全根路由的namespace配置
修改项目根urls.py中turbineweb的引入规则,显式指定namespace:urlpatterns = [ path('admin/', admin.site.urls), path('', include('accounts.urls', namespace='accounts')), path('', include('turbineweb.urls', namespace='turbineweb')), ] - 验证修复
保存所有修改后重启Django开发服务,清除浏览器缓存后重新访问localhost:8000/home即可正常加载页面。
可选优化:如果觉得users-registration命名不符合使用习惯,可以直接修改accounts/urls.py中注册路由的name参数(比如改为register),只要保证路由定义的name和模板中引用的名称完全一致、命名空间前缀正确,就不会触发反向解析错误。
内容的提问来源于stack exchange,提问作者Robson
相关产品推荐
相关产品推荐

