TemplateDoesNotExist错误本质是Django按TEMPLATES配置顺序在DIRS路径和APP_DIRS的app/templates目录中查找模板文件失败。常见原因包括:DIRS路径拼写错误或不存在、APP_DIRS启用时模板未放在app/templates/app_name/下、INSTALLED_APPS顺序导致同名模板被覆盖,以及filesystem.Loader优先于app_directories.Loader引发的路径冲突。

TemplateDoesNotExist 错误本质是 Django 找不到模板文件
这个报错不是模板语法错了,而是 Django 根本没在任何地方定位到你写的 template_name(比如 "blog/post_list.html")。它会按 TEMPLATES 配置里定义的顺序,依次在每个路径下查找该文件。只要全部路径都扫完还没找到,就抛出 TemplateDoesNotExist。
检查 DIRS 路径是否拼写正确且存在
Django 不会自动创建模板目录,也不会提示“路径不存在”,它只是默默跳过。常见翻车点:
-
DIRS里写了os.path.join(BASE_DIR, "templates"),但实际目录叫template(少了个s) - 路径用了相对路径如
"./templates",而当前工作目录不是项目根目录(比如你在子目录 runserver) - 路径中混用了正斜杠和反斜杠(Windows 下尤其容易错),建议统一用
os.path.join()或pathlib.Path - 目录权限问题:Django 进程用户(如 gunicorn 用户)没有读取该目录的权限
验证方法:在 Django shell 里执行 from django.template.loader import get_template; get_template("xxx.html"),看是否报同样错误;或直接在 Python 中 os.path.isdir(你的 DIRS 路径) 检查路径是否存在。
APP_DIRS = True 时,模板必须放在 app 的 templates/ 子目录下
启用 APP_DIRS 后,Django 会自动扫描每个已注册 app 目录下的 templates/ 文件夹(注意是固定名字 templates,不是 template 或 tpl),且要求模板路径要带 app 名前缀。
强戈环形山: q15040409-刻画家功能概述强戈环形山: q15040409-刻画家是一项面向实际任务的技能,主要用于平顶山: 维西翁: 1:1.0. 塔格斯: rap.github: 自动化。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该
立即学习“Python免费学习笔记(深入)”;
- 如果你的 app 叫
blog,想加载"post_list.html",那文件必须放在blog/templates/blog/post_list.html(第二层blog/是命名空间,不能省) - 如果放成了
blog/templates/post_list.html(缺了 app 子目录),Django 就找不到 - 多个 app 有同名模板(如都叫
"base.html")时,Django 按INSTALLED_APPS顺序加载,排前面的会覆盖后面的 —— 这既是机制也是隐患
调试技巧:在视图里加一行 print([t.origin.name for t in get_template("xxx.html").engine.template_loaders]),能看到 Django 实际搜索了哪些 loader 和路径。
混合使用 DIRS 和 APP_DIRS 时的优先级陷阱
Django 按 TEMPLATES 配置中 loaders 列表顺序查找,而默认配置里 filesystem.Loader(对应 DIRS)排在 app_directories.Loader(对应 APP_DIRS)前面。这意味着:
- 即使某个模板只存在于某个 app 的
templates/下,但如果DIRS里有个同名空文件或占位文件,Django 会先加载它,然后可能因语法错误再报另一个异常 —— 表面看还是TemplateDoesNotExist,实则已被干扰 - 开发时习惯把通用模板(如
base.html)放DIRS,而 app 特有模板放各自templates/app_name/,这时要注意命名别冲突,否则后者永远不生效 - 线上环境常禁用
APP_DIRS,全靠DIRS统一管理模板,此时漏配某个 app 的模板路径就会直接报错
最稳妥的做法:开发期打开 DEBUG=True,访问页面时看 Django 调试页底部的 “Template-loader postmortem” 区域,它会清清楚楚列出所有尝试过的绝对路径 —— 哪条路径被查了、是否命中、是否可读,一目了然。

















