Django3.2.7模板放app/templates/app子目录报TemplateDoesNotExist如何解决
Django TemplateDoesNotExist 问题解决方案
错误原因
你当前的操作错误点是不符合Django默认的模板命名空间加载规则:
- 当你开启
APP_DIRS = True时,Django会将每个已注册应用下的templates目录作为模板搜索的根路径 - 你将
index.html放在movies/templates/movies/路径下,相对于模板根目录的完整路径就是movies/index.html,直接写index.html的话Django只会在templates根目录下查找,当然找不到对应文件。
无需修改TEMPLATES.DIRS的检查项
- 首先确认
settings.py中TEMPLATES配置的APP_DIRS属性为True,3.2版本默认开启,检查是否被手动修改过:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, # 必须为True 'OPTIONS': { 'context_processors': [ # 默认上下文处理器省略 ], }, }, ]
- 确认应用目录结构完全符合规范,层级不能出错:
项目根目录/ ├── movies/ │ ├── __init__.py │ ├── views.py │ ├── templates/ │ │ └── movies/ # 必须存在与应用同名的子目录作为命名空间 │ │ └── index.html │ └── admin.py、models.py等其他应用文件 └── 项目主目录/ ├── __init__.py ├── settings.py └── urls.py
- 确认
movies应用已经正确加入INSTALLED_APPS列表,注意如果写的是movies.apps.MoviesConfig也属于正确配置,不需要改回纯应用名。
关于模板路径加应用名的疑问
模板路径前加应用名属于Django官方推荐的最佳实践,完全不会提高维护成本,反而能避免多应用开发时出现同名模板被覆盖的问题,所有Django官方内置应用、第三方应用都遵循该规范,完全可以放心使用。
你提到的第一种修改DIRS的方法属于不符合框架设计的临时解决方案,不建议使用,会导致后续项目模板管理混乱。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

