Django通用视图DetailView的template_name_field配置问题咨询
template_name_field 属性规则说明 对应示例视图代码如下:
class ArticleDetailView(DetailView): template_name = None template_name_field = None
为什么template_name_field的默认值为None?
这个属性是框架提供的可选动态模板配置能力,默认设为None就是表示默认不启用该功能。
它的实际作用是:你可以将其赋值为模型上的某个字段名,视图查询到当前展示的模型实例后,会优先读取该字段存储的字符串值作为渲染用的模板路径。
举个实际使用场景:做CMS系统时如果需要支持不同文章使用不同版式的详情页,可以给Article模型增加一个存储模板路径的字段,比如custom_tpl,在视图里配置template_name_field = "custom_tpl",渲染时就会自动读取每篇文章自己配置的模板路径,不需要写额外逻辑判断。
默认值设为None就是告诉框架:不需要走这个从模型实例取模板名的逻辑,按常规流程选模板即可。
有说法称template_name_field的默认值会是'article_detail.html',该表述是否正确?
这个表述完全错误,属于把两个完全独立的模板选择逻辑混淆了。
首先从Django源码层面看,DetailView继承的模板响应父类里,template_name_field的初始默认值就是None,不存在自动变成模板路径字符串的逻辑。
你看到的article_detail.html是框架模板选择逻辑里最末位的兜底推断结果,和template_name_field没有任何关系:当你既没有手动设置template_name,也没有配置template_name_field拿到有效模板路径时,Django会按照<应用名>/<模型名小写>_detail.html的规则自动拼接兜底模板名,比如blog应用下的Article模型,兜底拼出来的模板路径就是blog/article_detail.html。
DetailView模板选择优先级(从高到低)
- 手动为
template_name属性配置的有效值 - 若
template_name_field不为None,从当前模型实例对应字段读取到的模板路径值 - 框架按命名规则自动推断的兜底模板路径
内容的提问来源于stack exchange,提问作者aaaa

