Django出现NoReverseMatch错误:无法找到'login'视图或路由匹配
问题:Django中
NoReverseMatch: Reverse for 'login' not found错误解决 我用Django搭建网站时遇到错误,明明在views.py里定义了login视图,也在urls.py里配置了路由,却提示login不是有效的视图函数或路由名称,相关代码和报错信息如下:
应用myapp/urls.py
from django.urls import path, include from . import views import sys app_name = "myapp" urlpatterns = [ path('', views.index, name='index'), path('register', views.register, name='register'), path('login', views.login, name='login'), path('logout', views.logout, name='logout'), path('wordsearch', views.wordsearch, name='wordsearch'), path('generate', views.generate, name="generate") ]
myapp/views.py
from django.shortcuts import render, redirect # redirect: chuyen huong user toi page khac from django.contrib.auth.models import User, auth from django.contrib import messages from django.http import HttpResponse from .models import Feature from myproject.main import * from django.contrib.auth.forms import UserCreationForm, AuthenticationForm # Create your views here. # gửi request tới thư mục templates để tìm file index.html def index(request): # dictionary return render(request, 'login.html') # log in and sign up function def register(request): # check if the page is rendered with a post method if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): form.save() # log the user in return redirect('login') else: form = UserCreationForm() return render(request, 'register.html', {'form': form}) def login(request): if request.method == "POST": form = AuthenticationForm(data = request.POST) if form.is_valid(): return redirect('wordsearch') else: form = AuthenticationForm() return render(request, 'login.html', {'form': form}) # log out def logout(request): auth.logout(request) # log all user out of platform return redirect('/') def wordsearch(request): return render(request, 'wordsearch.html')
templates/login.html
<h1> Login Now </h1> {% for message in messages %} <h3>{{message}}</h3> {% endfor %} <form action="{% url 'login' %}" method="POST"> {% csrf_token %} {{ form }} <input type="submit" value="Login"> </form>
主项目urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('myapp.urls')) ]
报错栈信息
Traceback (most recent call last): File "D:\VSC\word-search-AI\env\Lib\site-packages\django\core\handlers\exception.py", line 56, in inner response = get_response(request) ^^^^^^^^^^^^^^^^^^^^^ File "D:\VSC\word-search-AI\env\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\VSC\word-search-AI\env\myproject\myapp\views.py", line 13, in index return render(request, 'login.html') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\VSC\word-search-AI\env\Lib\site-packages\django\shortcuts.py", line 24, in render content = loader.render_to_string(template_name, context, request, using=using) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\VSC\word-search-AI\env\Lib\site-packages\django\template\loader.py", line 62, in render_to_string return template.render(context, request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\VSC\word-search-AI\env\Lib\site-packages\django\template\backends\django.py", line 61, in render return self.template.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\VSC\word-search-AI\env\Lib\site-packages\django\template\base.py", line 175, in render return self._render(context) ^^^^^^^^^^^^^^^^^^^^^ File "D:\VSC\word-search-AI\env\Lib\site-packages\django\template\base.py", line 167, in _render return self.nodelist.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\VSC\word-search-AI\env\Lib\site-packages\django\template\base.py", line 1005, in render return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\VSC\word-search-AI\env\Lib\site-packages\django\template\base.py", line 1005, in <listcomp> return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\VSC\word-search-AI\env\Lib\site-packages\django\template\base.py", line 966, in render_annotated return self.render(context) ^^^^^^^^^^^^^^^^^^^^ File "D:\VSC\word-search-AI\env\Lib\site-packages\django\template\defaulttags.py", line 471, in render url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\VSC\word-search-AI\env\Lib\site-packages\django\urls\base.py", line 88, in reverse return resolver._reverse_with_prefix(view, prefix, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\VSC\word-search-AI\env\Lib\site-packages\django\urls\resolvers.py", line 828, in _reverse_with_prefix raise NoReverseMatch(msg) django.urls.exceptions.NoReverseMatch: Reverse for 'login' not found. 'login' is not a valid view function or pattern name.
问题原因及解决方法
核心原因
你在应用的urls.py中设置了app_name = "myapp",这意味着所有该应用下的路由名称都需要加上命名空间前缀才能正确反向解析。而你在模板和视图中使用redirect('login')、{% url 'login' %}时没有指定命名空间,导致Django找不到对应的路由。
具体修复步骤
- 模板中修正url标签
修改login.html中的form action部分,加上命名空间:
<form action="{% url 'myapp:login' %}" method="POST">
- 视图中修正redirect调用
修改views.py中register函数的redirect语句:
return redirect('myapp:login')
同时login函数中的redirect也建议加上命名空间:
return redirect('myapp:wordsearch')
- 可选:检查路由末尾的斜杠
虽然这不是本次错误的原因,但Django默认推荐路由路径末尾加斜杠,比如path('login/', views.login, name='login'),这样用户访问login时会自动重定向到login/,避免路径不一致问题。
完成以上修改后,重启Django服务,错误即可解决。
内容的提问来源于stack exchange,提问作者nicole
相关产品推荐
相关产品推荐

