Django登录提交触发NoReverseMatch错误,请求技术协助
Django登录后触发NoReverseMatch错误的解决方法
问题详情
登录页面可正常渲染,但提交登录表单后出现如下错误:
NoReverseMatch at /login/ Reverse for '' not found. '' is not a valid view function or pattern name
以下是项目相关配置及模板代码:
settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) DEBUG = True ALLOWED_HOSTS = [] import sys sys.modules['fontawesome_free'] = __import__('fontawesome-free') INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'class2.apps.Class2Config', 'crispy_forms', 'django_bootstrap_icons', 'fontawesome_free', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'abrar_class.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'abrar_class.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True STATIC_URL = 'static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] LOGIN_REDIRECT_URL = "" DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
urls.py
from django import VERSION from django.urls import path from django.contrib.auth import views as auth_views from .views import CourseDetailView, CourseListView, YourCourses, ProfileDetailView from . import views urlpatterns = [ path("", CourseListView.as_view(), name="index"), path("login/", auth_views.LoginView.as_view(template_name='class/login.html'), name='login'), path("logout", views.logout_view, name="logout"), path("register", views.register, name="register"), path("<slug>", CourseDetailView.as_view(), name="course"), path('get_enrolled/<slug>/', views.get_enrolled, name='get_enrolled'), path('your_courses/', YourCourses.as_view(), name='your_courses'), path('profile/<int:pk>/', ProfileDetailView.as_view(), name='profile'), ]
login.html
{% extends "class/base.html" %} {% load crispy_forms_tags %} {% block content %} <br> <div class="content-section"> <form method="POST"> {% csrf_token %} <fieldset class="form-group" style="color: #f5a425"> <legend class="border-bottom mb-4" style="color:#f5a425;">Log In</legend> {{ form|crispy }} </fieldset> <div class="form-group"> <button class="btn btn-outline-warning" type="submit">Login</button> </div> </form> <div class="border-top pt-3"> <small class="text-muted"> Need An Account? <a class="ml-2" href="{% url 'register' %}">Sign Up</a> </small> </div> </div> {% endblock content %}
问题原因
错误根源在settings.py里的LOGIN_REDIRECT_URL配置:
LOGIN_REDIRECT_URL = ""
Django的LoginView在登录成功后,会尝试对LOGIN_REDIRECT_URL的值做反向解析。如果设置为空字符串,它会寻找名为空字符串的URL模式,但你的项目里没有对应的视图或URL名称,因此触发NoReverseMatch错误。
解决方法
把LOGIN_REDIRECT_URL改成项目中已存在的URL名称,比如首页的index:
LOGIN_REDIRECT_URL = "index"
或者直接指定具体的URL路径:
LOGIN_REDIRECT_URL = "/"
修改后重启Django服务,再次登录就能正常跳转,不会再出现该错误。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

