我知道Django在其模板引擎中使用默认名称,例如,如果我有一个Form for Comments Model,那么Django将会搜索comments_form.html来渲染该表单。但是我可以改变吗?除了可以使用comment_form进行表单渲染外,我还可以使用其他html作为模板吗?如何使用基于类的视图做到这一点?
答案 0 :(得分:1)
当然,这非常简单。每个显示模板的Django通用视图(继承自TemplateResponseMixin
)都可以通过template_name
属性告知要使用的模板:
class MyView(FormView):
template_name = 'myapp/mytemplate.html'
这假设您使用的是标准Django目录布局,例如
myproject/myproject/templates/myproject/mytemplate.html
myproject/myapp/templates/myapp/mytemplate.html
等...
您还可以通过覆盖视图的get_template_names
方法来修改这些视图的模板选择行为。
这些TemplateResponseMixin
派生视图的最简单用法(例如TemplateView
和FormView
)没有其他方法来知道要使用哪种模板,它们需要您指定template_name
或实现get_template_names
方法,否则当您尝试访问视图时,您将获得异常。
但是与Django模型配合使用的视图类(例如DetailView
,UpdateView
等)更加聪明;这些类将查看被告知要使用的模型的名称,并从中得出模板的名称,例如:
默认情况下,名为“ Comments”的模型的UpdateView
将尝试查找名为“ comments_form.html”的模板。 DetailView
将尝试使用名为“ comments_detail.html”的模板...
因此,如果您遵循他们的约定并以他们期望的方式命名您的模板,那么一切都将正常工作..它将自动找到您的模板。所有其他面向模型的视图类(DeleteView
,CreateView
等)也将执行此操作。
但是您始终可以使用template_name
属性或实现get_template_names()
来覆盖此行为。
以下是Django文档的确切部分,可能会有所帮助: https://docs.djangoproject.com/en/2.2/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.get_template_names