Django初学者遇TemplateDoesNotExist错误:为何查找posts/post_list.html?
问题分析与解决思路
核心原因:通用视图的默认模板规则
你大概率是用了ListView这类Django通用视图——这类视图自带默认逻辑:如果没明确指定template_name,会自动按[app名]/[模型名]_list.html的路径查找模板。哪怕你以为自己指定了template_name,也可能是代码有疏漏(比如拼写错误、缩进不对导致配置不生效),或是视图类继承关系没处理对,触发了默认规则。
排查步骤
- 检查视图代码:确认视图类里
template_name = 'home.html'的拼写、缩进是否正确(要和model属性同级),有没有写错大小写或漏写后缀。 - 核对模板文件位置:
- 如果模板放在项目根目录的
templates文件夹下,要确保settings.py的TEMPLATES配置中,DIRS包含了BASE_DIR / 'templates'这个路径。 - 如果模板放在
postsapp的templates文件夹下,路径要对应上——比如指定home.html的话,文件应该在posts/templates/home.html,而不是嵌套在posts/templates/posts/下。
- 如果模板放在项目根目录的
- 检查
INSTALLED_APPS:确认postsapp已经添加到settings.py的INSTALLED_APPS列表里,否则Django不会扫描这个app的templates目录。
常见错误示例
比如下面的代码会触发默认查找逻辑:
from django.views.generic import ListView from .models import Post class HomeView(ListView): model = Post # 错误:template_name缩进错了,放在了方法内部,不生效 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) template_name = 'home.html' return context
正确写法应该是:
class HomeView(ListView): model = Post template_name = 'home.html' # 和model属性同级,正确生效 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 其他业务逻辑 return context
内容的提问来源于stack exchange,提问作者Jules Raschilas
相关产品推荐
相关产品推荐

