Django视图如何确定渲染的HTML页面?未指定template_name时的规则
嘿,这两个问题问到点子上了!作为经常和Django通用视图打交道的开发者,我来给你掰扯清楚:
关于Django视图渲染HTML页面的疑问解答
问题1:Django视图如何决定渲染/显示哪个HTML页面?
Django里视图分两种类型,它们确定模板的方式略有不同:
函数视图:你得在
render()函数里明明白白指定template_name参数,比如:from django.shortcuts import render from .models import Movie def movie_list(request): movies = Movie.objects.all() # 这里直接指定要渲染的模板文件 return render(request, 'movie_list.html', {'movies': movies})Django会去所有已注册app的
templates目录(以及项目根目录的templates,如果settings.py里配置了的话)找这个文件。类视图(尤其是通用视图):有两种选择:
- 手动设置
template_name属性,就像你代码里注释掉的那样,直接告诉Django用哪个模板; - 让Django自己找——也就是你现在遇到的情况,它会按照一套默认规则自动定位模板。
- 手动设置
问题2:未指定template_name时,Django如何确定要渲染的HTML页面?
像你用的ListView、DetailView这类通用类视图,Django早就内置了一套模板命名约定,不用你手动指定也能精准找到模板,具体逻辑是这样的:
核心命名规则
模板路径是固定格式:{app名称}/{模型小写名}{视图类型后缀}.html
拆解一下:
app名称:你的Movie模型所在的app的名字(比如你的app叫movies,这里就填movies);模型小写名:把模型类名转成小写,比如Movie就变成movie;视图类型后缀:不同的通用视图对应不同的后缀:ListView→_listDetailView→_detail- 新增/修改用的
CreateView/UpdateView→_form - 删除用的
DeleteView→_confirm_delete
结合你的代码分析
你的MovieList继承自ListView,模型是Movie,所以Django自动生成的模板路径就是:{你的app名称}/movie_list.html
这就是为什么你访问http://localhost:8000/movies/时,能看到movie_list.html的内容——Django自动去你app的templates目录下找到了这个文件。
同理,你的MovieDetail如果不指定template_name,Django会自动去找{你的app名称}/movie_detail.html。
额外小提示
- 如果你把模板放在项目根目录的
templates文件夹里,只要在settings.py的TEMPLATES配置中加了DIRS路径,Django也会去那里找; - 要是不想用默认模板,直接取消你代码里的注释,把
template_name改成你想要的路径就行,比如template_name = 'custom_templates/all_movies.html'。
内容的提问来源于stack exchange,提问作者gaurav
相关产品推荐
相关产品推荐

