TemplateDoesNotExist 是 Django 初学者最常遇到的错误之一。它的含义非常明确:Django 找不到你试图渲染的那个 HTML 模板文件。
请按照以下步骤逐一排查,通常能解决 95% 的问题:
1. 检查 settings.py 中的配置(最常见原因)
Django 需要明确知道去哪里找模板文件。打开 settings.py,找到 TEMPLATES 配置项。
重点检查 'DIRS' 列表是否为空或路径不正确。
错误配置示例:
TEMPLATES = [
{
...
'DIRS': [], # 这里是空的,Django 只会去 app 内找,不会去项目根目录找
...
},
]
正确配置示例:
你需要告诉 Django 去项目的根目录下的 templates 文件夹查找。
import os # 确保顶部导入了 os
TEMPLATES = [
{
...
# 这行代码表示:去项目根目录下的 templates 文件夹找模板
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
},
]
2. 检查 INSTALLED_APPS 设置
如果你的模板文件放在某个 App 的目录下(例如 myapp/templates/myapp/home.html),那么必须确保该 App 已经注册。
打开 settings.py,检查 INSTALLED_APPS:
INSTALLED_APPS = [
'django.contrib.admin',
...
'myapp', # 确保你的 app 名字在这里
]
3. 检查目录结构
Django 对目录结构非常敏感。常见的错误是把文件夹建错了位置。
场景 A:模板放在项目根目录(推荐新手使用)
如果你在 settings.py 中配置了 'DIRS': [os.path.join(BASE_DIR, 'templates')],那么目录结构必须是这样:
myproject/ <-- 根目录
├── manage.py
├── myproject/
│ ├── settings.py
│ └── ...
├── myapp/
└── templates/ <-- 必须在这里
└── index.html <-- 你的文件
场景 B:模板放在 App 目录内(Django 默认规范)
如果你没有修改 DIRS,Django 默认会去每个 App 下的 templates 文件夹找。注意:这里有个坑,需要在 templates 下再建一层以 App 名命名的文件夹。
myproject/
├── myapp/
│ └── templates/ <-- 第一层 templates
│ └── myapp/ <-- 第二层以 app 命名的文件夹 (关键!)
│ └── index.html <-- 你的文件
*注:如果不建第二层文件夹,可能会出现命名冲突。*
4. 检查文件名和后缀
这听起来很傻,但经常发生:
- 后缀错误 :文件名是
index.html,但在代码里写成了index.htm或者忘了写后缀。 - 大小写敏感 :在 Linux/Mac 系统下,
Index.html和index.html是两个不同的文件。 - 隐藏后缀 :有时候编辑器可能把文件保存成了
index.html.txt,请确保文件后缀确实是.html。
5. 检查视图中的调用代码
确保你在视图函数中写的名字和实际文件名一致。
# views.py
def index(request):
# 这里的 'index.html' 必须真实存在于配置的模板目录中
return render(request, 'index.html')
6. 终极排查法:使用 shell
如果你检查了以上所有步骤仍然报错,可以使用 Django Shell 来检查系统到底看到了什么。
打开终端运行:
python manage.py shell
进入 shell 后输入以下代码:
from django.template.loader import get_template
try:
get_template('index.html') # 换成你的文件名
print("找到了!")
except Exception as e:
print(f"错误信息: {e}")
如果报错,通常会显示 Django 尝试了哪些路径,例如:
Source does not exist at /path/to/project/templates/index.html
你可以对比它显示的路径和你实际的文件路径,就能发现问题所在。
总结检查清单:
settings.py里TEMPLATES的'DIRS'有没有加上templates路径?- 你的 HTML 文件是不是真的放在了那个路径下?
- App 是不是已经加到了
INSTALLED_APPS? - 文件名有没有写错?