求助:Django注册功能出现NoReverseMatch错误
咱们先把问题拆解一下:NoReverseMatch说白了就是Django找不到你在视图或模板里指定的URL名称对应的路由配置。结合你给出的环境信息(POST请求到/fir/signup/,Django1.11.12,Python2.7.14),我整理了几个最容易踩坑的排查方向:
1. 先检查URL路由的名称配置
首先得确认你在urls.py里给注册相关的路由设置了正确的name参数,举个例子:
# fir应用下的urls.py from django.conf.urls import url from . import views urlpatterns = [ url(r'^signup/$', views.signup_view, name='signup'), # 这里的name='signup'是核心 ]
要是你的视图里用了reverse('signup'),或者模板里写了{% url 'signup' %},但路由里没加这个name,或者name拼写错了,肯定会触发错误。另外,如果项目根urls.py里给应用加了命名空间(namespace),那调用的时候得写成reverse('fir:signup')或者{% url 'fir:signup' %},别漏了命名空间。
2. 视图重定向的URL名称要对应
注册是POST请求,处理完表单后一般会重定向到其他页面,比如登录页。如果你用了reverse()函数来生成重定向地址,得检查里面的URL名称是否真的存在于路由中。比如:
# 错误示例:如果没有名为'login'的路由,就会报错 return redirect(reverse('login'))
一定要确保这个名称在某个urls.py里已经配好对应的路由了。
3. 模板里的URL标签别写错
如果你的注册表单模板里用了{% url %}标签指定表单的action,比如:
<form method="post" action="{% url 'signup' %}">
这里的signup必须和路由里的name完全一致,Django1.11里URL名称是区分大小写的哦。要是加了命名空间,就得写成{% url 'fir:signup' %}。
4. 路由需要参数的话别漏传
如果你的路由定义了参数,比如url(r'^user/(?P<user_id>\d+)/$', views.user_profile, name='user_profile'),那调用reverse()或者{% url %}标签时必须传递对应的参数,比如reverse('user_profile', kwargs={'user_id': 1})或者{% url 'user_profile' user_id=1 %},少传参数也会导致NoReverseMatch。
5. 确认应用路由被正确引入
你已经把fir.apps.MusicConfig加到INSTALLED_APPS里了,这部分没问题,但要确保应用的urls.py已经被正确include到项目根urls.py中,比如:
# 项目根urls.py from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^fir/', include('fir.urls')), # 这里要正确引入应用的路由文件 ]
最后给你个小技巧:如果装了django-extensions,可以运行python manage.py show_urls,它会列出所有已注册的URL路径和对应的名称,你对比一下自己调用的名称是否存在,能快速定位问题。
内容的提问来源于stack exchange,提问作者Afreen Khan

