You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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里配置了的话)找这个文件。

  • 类视图(尤其是通用视图):有两种选择:

    1. 手动设置template_name属性,就像你代码里注释掉的那样,直接告诉Django用哪个模板;
    2. 让Django自己找——也就是你现在遇到的情况,它会按照一套默认规则自动定位模板。

问题2:未指定template_name时,Django如何确定要渲染的HTML页面?

像你用的ListView、DetailView这类通用类视图,Django早就内置了一套模板命名约定,不用你手动指定也能精准找到模板,具体逻辑是这样的:

核心命名规则

模板路径是固定格式:{app名称}/{模型小写名}{视图类型后缀}.html
拆解一下:

  • app名称:你的Movie模型所在的app的名字(比如你的app叫movies,这里就填movies);
  • 模型小写名:把模型类名转成小写,比如Movie就变成movie;
  • 视图类型后缀:不同的通用视图对应不同的后缀:
    • ListView → _list
    • DetailView → _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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:58:15