Django视图类渲染模板报错:TemplateDoesNotExist问题咨询
嘿,我来帮你捋清楚这个TemplateDoesNotExist的问题,你主要遗漏了Django里几个关于模板查找和类视图的核心知识点:
1. Django的模板路径查找规则
Django默认会在每个已注册应用的templates目录下搜索模板,而且绝对不要用带开头斜杠的路径(比如你写的/login/index.html)。开头的斜杠会让Django跳过应用内的templates,直接去项目根目录的templates文件夹找(如果没配置的话就找不到了)。
你的模板实际在login/templates/login/index.html,所以正确的template_name应该写成login/index.html——去掉开头的斜杠,Django就会自动去login应用的templates目录下找login/index.html了。
2. 类视图中get方法的返回值要求
你重写了Index类的get方法,但犯了一个小错误:调用了render却没有返回它!Django的视图必须返回一个HttpResponse对象(render函数本质就是生成并返回这个对象)。正确的写法应该是:
def get(self, request): return render(request, self.template_name)
其实更省心的是,TemplateView本身已经帮你实现了get方法的逻辑,你完全可以不用重写它——只要正确设置template_name就行,这也是Django通用视图的便利之处。
3. 应用注册的必要性(容易忽略的点)
虽然你没提,但一定要确认login应用已经加到项目settings.py的INSTALLED_APPS列表里了:
INSTALLED_APPS = [ # 其他默认应用... 'login', ]
Django只会在INSTALLED_APPS里的应用中查找模板资源,没注册的话,就算模板文件存在也找不到。
快速修正步骤
- 把
template_name改成login/index.html(去掉开头的斜杠) - 要么删除重写的
get方法,要么在get里返回render的结果 - 确认
login已经在INSTALLED_APPS中完成注册
这样调整后,你的页面应该就能正常加载啦。
内容的提问来源于stack exchange,提问作者Elcid_91

