You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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找不到对应的路由。

具体修复步骤

  1. 模板中修正url标签
    修改login.html中的form action部分,加上命名空间:
<form action="{% url 'myapp:login' %}" method="POST">
  1. 视图中修正redirect调用
    修改views.py中register函数的redirect语句:
return redirect('myapp:login')

同时login函数中的redirect也建议加上命名空间:

return redirect('myapp:wordsearch')
  1. 可选:检查路由末尾的斜杠
    虽然这不是本次错误的原因,但Django默认推荐路由路径末尾加斜杠,比如path('login/', views.login, name='login'),这样用户访问login时会自动重定向到login/,避免路径不一致问题。

完成以上修改后,重启Django服务,错误即可解决。

内容的提问来源于stack exchange,提问作者nicole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:24:53