首页 > 解决方案 > 尝试访问 Django 2.2 中的登录 url 时,位于 /en/user/login/ 的 TemplateDoesNotExist

问题描述

我正在将 Django 应用程序从 1.11 升级到 2.2。我已经完成了所有的迁移和一切,但我一直面临这个错误django.template.exceptions.TemplateDoesNotExist: registration/login.html。如果我错过了一些愚蠢简单的东西,我目前仍在学习 Django 道歉。我已在此处附上错误消息图片以及可能与此错误消息相关的文件。只是为了澄清我settings.py在模板下有以下内容:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates')
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                "django.contrib.auth.context_processors.auth",
                "django.template.context_processors.debug",
                "django.template.context_processors.i18n",
                "django.template.context_processors.media",
                "django.template.context_processors.static",
                "django.template.context_processors.tz",
                "django.contrib.messages.context_processors.messages",
                "django.template.context_processors.request",
            ]
        }
    }
]

以下是可能有助于调试的其他文件:

网址.py

from django.conf.urls import url, include
from django.urls import reverse_lazy
from userApp import views
from django.contrib.auth import views as django_contrib_auth_views
from django.contrib.auth.views import LoginView


urlpatterns = [
    url(r'^register/$', views.register, name='register'),
    url(r'^profile/$', views.profile, name='profile'),
    url(r'^login/$', views.rate_limit_login, name='login'),
    url(r'^rate_limited/$', views.rate_limited, name='rate_limited'),
    url(r'^logout/$', django_contrib_auth_views.LogoutView, {'template_name': 'userApp/logged_out.html', 'next_page': '/'}, name='logout'),
    url(r'^password_change/$', django_contrib_auth_views.PasswordChangeView, {'template_name': 'userApp/password_change_form.html', 'post_change_redirect': reverse_lazy('userApp:password_change_done')}, name='password_change'),
    url(r'^password_change/done/$', django_contrib_auth_views.PasswordChangeDoneView, {'template_name': 'userApp/password_change_done.html'}, name='password_change_done'),
    url(r'^password_reset/$', django_contrib_auth_views.PasswordResetView, {'template_name': 'userApp/password_reset_form.html', 'email_template_name': 'userApp/password_reset_email.html', 'post_reset_redirect': reverse_lazy('userApp:password_reset_done')}, name='password_reset'),
    url(r'^password_reset/done/$', django_contrib_auth_views.PasswordResetDoneView, {'template_name': 'userApp/password_reset_done.html'}, name='password_reset_done'),
    url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', django_contrib_auth_views.PasswordResetConfirmView, { 'template_name': 'userApp/password_reset_confirm.html', 'post_reset_redirect': reverse_lazy('userApp:password_reset_complete')}, name='password_reset_confirm'),
    url(r'^reset/done/$', django_contrib_auth_views.PasswordResetCompleteView, {'template_name': 'userApp/password_reset_complete.html'}, name='password_reset_complete'),

视图.py

from django.utils.translation import ugettext as _
from django.http import HttpResponse
from django.shortcuts import render, redirect, get_object_or_404
from django.urls import reverse
from django.contrib import messages
from django.conf import settings

from django.contrib.auth import authenticate, login
from django.contrib.auth.views import LoginView
from django.contrib.auth.decorators import login_required
from ratelimit.decorators import ratelimit
from django.forms.utils import ErrorList

from .forms import MyUserCreationForm, UserProfileForm
from .utils import ReCaptcha

from django.contrib.auth import get_user_model
User = get_user_model()
from django.views.decorators.clickjacking import xframe_options_exempt

import logging
logger = logging.getLogger(__name__)

@ratelimit(key='post:username', rate='10/5m')
@ratelimit(key='post:password', rate='10/5m')
@xframe_options_exempt
def rate_limit_login(request):
    if request.user.is_authenticated:
        return redirect(request.GET.get('next', reverse('mapApp:index')))

    if request.limited:
        return redirect(reverse('userApp:rate_limited'))
    print('Hits')
    return LoginView.as_view()(request, template_name='userApp/login.html')

def rate_limited(request):
    return render(request, 'userApp/rate_limited.html')

我尝试在 stackoverflow 上对此进行修复,因为这对很多人来说似乎是一个非常普遍的问题,但解决方案对我不起作用。由于某种原因,找不到 login.html 文件。我可以看到存在但不确定为什么找不到它。

标签: pythondjangoupgrade

解决方案


您应该将 传递template_name给登录视图的构造函数,因此:

return LoginView.as_view(template_name='userApp/login.html')(request)

推荐阅读