如何解决Django中accounts/login.html的TemplateDoesNotExist错误?
Django部署Heroku后TemplateDoesNotExist问题解决
问题描述
使用Django开发博客应用并部署到Heroku后,访问/accounts/login/时出现TemplateDoesNotExist错误,无法加载login.html页面。尝试配置'DIRS': [os.path.join(BASE_DIR, 'Templates')]未解决问题,文件结构及settings.py相关配置如下:
文件结构
BLOG ├─.idea ├─accounts | ├─__pycache__ | ├─migrations | ├─Templates | | └─accounts | | ├─login.html | | └─signup.html | ├─__init__.py | ├─admin.py | ├─apps.py | ├─models.py | ├─tests.py | ├─urls.py | └─views.py ├─articles | ├─__pycache__ | ├─migrations | ├─Templates | | └─articles | | ├─article_create.html | | ├─article_details.html | | ├─article_form.html | | ├─article_list.html | | └─pagination.html | ├─__init__.py | ├─admin.py | ├─apps.py | ├─forms.py | ├─models.py | ├─tests.py | ├─urls.py | └─views.py ├─blog | ├─__pycache__ | ├─Templates | | └─default.html | ├─__init__.py | ├─asgi.py | ├─settings.py | ├─urls.py | ├─views.py | └─wsgi.py ├─media ├─static | ├─favicon.ico | ├─logo.png | ├─slugify.js | ├─styles.css | └─background.jpg ├─db.sqlite3 └─manage.py
当前settings.py中TEMPLATES配置
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': ['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', ], }, }, ]
解决方案
1. 确认应用已在INSTALLED_APPS中注册
Django只会在已注册的应用目录下查找模板,打开settings.py,确保accounts、articles和blog都在INSTALLED_APPS列表中:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 注册你的应用 'accounts.apps.AccountsConfig', 'articles.apps.ArticlesConfig', 'blog.apps.BlogConfig', ]
注:每个应用的Config类可在对应app的
apps.py文件中找到,比如accounts/apps.py中的AccountsConfig。
2. 修正模板渲染路径
在accounts/views.py中渲染登录页面时,必须使用完整的相对路径'accounts/login.html',而非直接'login.html':
from django.shortcuts import render def login_view(request): # 正确的模板路径 return render(request, 'accounts/login.html')
3. 调整TEMPLATES中的DIRS配置
项目根目录并无名为Templates的文件夹,当前DIRS配置无效。由于采用应用内模板结构,只需保留APP_DIRS: True,将DIRS改为空列表即可:
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', ], }, }, ]
4. 检查Git是否追踪模板文件
确保.gitignore文件未忽略Templates文件夹,否则部署到Heroku时模板文件不会被上传。打开.gitignore,删除任何包含Templates的规则,之后执行以下命令提交模板文件:
git add accounts/Templates articles/Templates blog/Templates git commit -m "Add template files" git push heroku main
5. 排查大小写问题
Heroku运行在Linux环境下,文件名区分大小写。确认模板文件名是login.html(全小写),而非Login.html或其他大小写混合的名称。
内容的提问来源于stack exchange,提问作者Mail Fun
相关产品推荐
相关产品推荐

