表单渲染 API
表单渲染过程可以在几个层次上进行定制:
- 部件可以指定自定义模板名称。
- 表单和部件可以指定自定义渲染器类。
- 组件的模板可以被项目覆盖。(可重用的应用程序通常不应该覆盖内置模板,因为它们可能与项目的自定义模板相冲突。)
表单模板的渲染是由一个可定制的渲染器类控制的。可以通过更新 配置来指定自定义渲染器。它的默认值是 '
django.forms.renderers.DjangoTemplates
'
。
你也可以通过设置 属性或使用 Widget.render()
的 renderer
参数来提供一个自定义的渲染器。
使用 或实现你自己的模板表单渲染器。自定义渲染器必须实现一个 render(template_name, context, request=None)
方法。它应该返回一个已渲染的模板(作为一个字符串)或引发 TemplateDoesNotExist
。
class DjangoTemplates
这个渲染器使用一个独立的 引擎(与你在 TEMPLATES
配置中设置的内容无关)。它首先从 django/forms/templates
内置的表单模板目录中加载模板,然后使用 加载器从已安装的应用的模板目录中加载模板。
class Jinja2
这个渲染器和 DjangoTemplates
渲染器一样,只是它使用了 后台。内置部件的模板位于 django/forms/jinja2
,安装的应用可以在 jinja2
目录下提供模板。
要使用这个后端,你项目中的所有部件和它的第三方应用程序必须有 Jinja2 模板。除非你提供自己的 Jinja2 模板给没有模板的部件,否则你不能使用这个渲染器。例如, django.contrib.admin
由于使用了 Django 模板标签,所以没有为其部件提供 Jinja2 模板。
class TemplatesSetting
这个渲染器可以让你完全控制部件模板的来源。它使用 根据 TEMPLATES
配置中设置的内容来查找部件模板。
使用这个渲染器和内置的部件模板有以下两种方式:
使用这个渲染器需要你确保你的项目所需的表单模板可以被找到。
部件模板从 中接收一个上下文。默认情况下,部件在上下文中只接收一个值,widget
。这是一个字典,其中包含的值如:
name
value
attrs
is_hidden
template_name
有些部件会给上下文添加更多信息。例如,所有子类 Input
定义了 widget['type']
和 MultiWidget
定义了 widget['subwidgets']
用于循环。
每个部件都有一个 template_name
属性,其值如 input.html
。内建的部件模板存储在 django/forms/widgets
路径中,你可以为 input.html
提供一个自定义模板。你可以通过定义 django/forms/widgets/input.html
来为 提供一个自定义模板,例如。参见 了解每个部件的模板名称。
要覆盖部件模板,你必须使用 TemplatesSetting
渲染器。然后覆盖部件模板的工作原理 。