Django默认登录页报错TemplateDoesNotExist求解决
问题概述
使用Django自带默认登录页面时触发TemplateDoesNotExist错误,提示找不到registration/login.html,模板加载器在项目templates目录及auth、admin的模板目录中均未定位到该文件。
错误详情
TemplateDoesNotExist at /accounts/login/
registration/login.html
请求方法:GET
请求URL:http://134.209.220.170/accounts/login/?next=/timwise/upload/
Django版本:5.0
异常类型:TemplateDoesNotExist
异常值:registration/login.html
异常位置:/usr/local/lib/python3.10/dist-packages/django/template/loader.py第47行,select_template函数中
触发于:django.contrib.auth.views.LoginView
Python可执行文件:/usr/bin/python3
Python版本:3.10.12
模板加载器诊断:
Django按以下顺序尝试加载模板:
使用django引擎:
django.template.loaders.filesystem.Loader: /home/django/django_project/templates/registration/login.html(源不存在)
django.template.loaders.app_directories.Loader: /usr/local/lib/python3.10/dist-packages/django/contrib/admin/templates/registration/login.html(源不存在)
django.template.loaders.app_directories.Loader: /usr/local/lib/python3.10/dist-packages/django/contrib/auth/templates/registration/login.html(源不存在)
当前配置
settings.py 模板配置
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # 'DIRS': [BASE_DIR, "/home/django/django_project/templates"], 'DIRS': [os.path.join(BASE_DIR, 'templates')], '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', ], }, }, ]
登录跳转视图代码
class FileUploadView(LoginRequiredMixin, CreateView): model = Files form_class = FileUploadForm template_name = 'upload.html' success_url = reverse_lazy('success') def form_valid(self, form): file = form.save() filename = file.file.name msg="file name is good" print('file loaded successfully') messages.success(self.request, f"File '{filename}' uploaded successfully!") return redirect('success', filename=filename, msg=msg) def form_invalid(self, form): messages.error(self.request, "File upload failed. Please check the file and try again.") return super().form_invalid(form)
项目/应用级urls.py
from django.urls import path, include from .views import UploadHighlights, FileUploadView from django.views.generic import TemplateView urlpatterns = [ path('upload/', FileUploadView.as_view(), name='upload'), path('accounts/', include('django.contrib.auth.urls')), path('success/<str:filename>/<str:msg>/', TemplateView.as_view(template_name='success.html'), name='success'), ]
解决方案
方案1:手动创建登录模板文件
Django的LoginView默认查找registration/login.html模板,按以下步骤创建:
- 在项目根目录的
templates文件夹内,创建registration子目录 - 在
registration目录下创建login.html文件,示例内容:
<!DOCTYPE html> <html> <head> <title>登录</title> </head> <body> <h2>登录</h2> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">登录</button> </form> </body> </html>
方案2:自定义LoginView指定模板路径
若不想使用默认模板路径,可在urls.py中自定义登录路由,指定已有模板:
from django.urls import path, include from django.contrib.auth.views import LoginView from .views import UploadHighlights, FileUploadView from django.views.generic import TemplateView urlpatterns = [ path('upload/', FileUploadView.as_view(), name='upload'), # 替换默认登录路由,指定自定义模板路径 path('accounts/login/', LoginView.as_view(template_name='your_custom_login.html'), name='login'), # 保留其他auth路由 path('accounts/', include('django.contrib.auth.urls')), path('success/<str:filename>/<str:msg>/', TemplateView.as_view(template_name='success.html'), name='success'), ]
确保your_custom_login.html存在于templates目录下。
方案3:修复Django auth模块模板文件
若希望使用Django自带默认模板,执行以下操作:
- 检查路径
/usr/local/lib/python3.10/dist-packages/django/contrib/auth/templates/registration/是否存在login.html - 若不存在,重新安装Django:
pip install --upgrade django==5.0
额外检查项
- 确认
INSTALLED_APPS中包含django.contrib.auth和django.contrib.messages - 确认项目
templates目录存在且权限正确(Django进程可读取该目录)
内容的提问来源于stack exchange,提问作者user3808752

