Django的窗体小部件使用Django的 template engines system .
表单呈现过程可以在多个级别进行自定义:
小部件可以指定自定义模板名称。
窗体和小部件可以指定自定义渲染器类。
小部件的模板可以被项目覆盖。(可重用应用程序通常不应重写内置模板,因为它们可能与项目的自定义模板冲突。)
表单模板的呈现由可自定义的呈现器类控制。可以通过更新 FORM_RENDERER
设置。它默认为 '
:class:django.forms.renders.djangotemplates'
.
通过指定自定义窗体呈现器并重写 form_template_name
您可以从单个位置调整整个项目的默认表单标记。
还可以通过设置每个表单或每个小部件的 Form.default_renderer
属性或通过使用 renderer
的论点 Form.render()
,或 Widget.render()
。
匹配点适用于表单集呈现。看见 在视图和模板中使用表单集 以供讨论。
使用其中之一 built-in template form renderers 或者实现你自己的。自定义呈现器必须实现 render(template_name, context, request=None)
方法。它应该返回呈现的模板(作为字符串)或引发 TemplateDoesNotExist
.
内置窗体呈现器的基类。
用于呈现表单的模板的默认名称。
默认为 "django/forms/div.html"
模板。
用于呈现表单集的模板的默认名称。
默认为 "django/forms/formsets/div.html"
模板。
用于呈现 BoundField
。
默认为 "django/forms/field.html"
呈现给定的模板,或引发 TemplateDoesNotExist
。
DjangoTemplates
¶此渲染器使用独立的 DjangoTemplates
引擎(未连接到您可能在 TEMPLATES
设置)。它首先从中的内置表单模板目录加载模板 django/forms/templates 然后从安装的应用程序的模板目录中使用 app_directories
装载机。
如果要使用来自 TEMPLATES
设置,例如上下文处理器,使用 TemplatesSetting
渲染器。
自 5.0 版本弃用.
的别名 DjangoTemplates
。
Jinja2
¶此呈现器与 DjangoTemplates
呈现器,除非它使用 Jinja2
后端。内置微件的模板位于 django/forms/jinja2 并且已安装的应用程序可以在 jinja2
目录。
要使用此后端,项目中的所有表单和小部件及其第三方应用程序都必须具有JJIA2模板。除非您为没有任何模板的小部件提供您自己的JJIA2模板,否则您不能使用此呈现器。例如, django.contrib.admin
由于使用了Django模板标记,所以它的窗口小部件不包含JJIA2模板。
自 5.0 版本弃用.
的别名 Jinja2
。
TemplatesSetting
¶该呈现器使您可以完全控制表单和小部件模板的来源。它使用 get_template()
根据中配置的内容查找模板 TEMPLATES
布景。
将此渲染器与内置模板一起使用需要执行以下任一操作:
'django.forms'
在里面 INSTALLED_APPS
以及至少一台引擎 APP_DIRS=True
.
将内置模板目录添加到 DIRS
您的一个模板引擎的。要生成该路径::
import django
django.__path__[0] + "/forms/templates" # or '/forms/jinja2'
使用此呈现器需要确保可以找到项目所需的表单模板。
表单集模板从以下位置接收上下文 BaseFormSet.get_context()
。默认情况下,表单集接收具有下列值的字典:
formset
:表单集实例。
表单模板从接收上下文 Form.get_context()
。默认情况下,表单接收具有下列值的词典:
form
:装订的表格。
fields
:除隐藏字段外的所有绑定字段。
hidden_fields
:所有隐藏的绑定字段。
errors
:所有与字段无关或与隐藏字段相关的表单错误。
字段模板从接收上下文 BoundField.get_context()
。默认情况下,字段接收具有下列值的词典:
field
: BoundField
。
小部件模板从接收上下文 Widget.get_context()
. 默认情况下,小部件在上下文中接收单个值, widget
. 这是一个包含如下值的字典:
name
value
attrs
is_hidden
template_name
一些小部件向上下文添加更多信息。例如,所有子类的小部件 Input
定义 widget['type']
和 MultiWidget
定义 widget['subwidgets']
用于循环。
若要重写表单集模板,必须使用 TemplatesSetting
渲染器。则覆盖表单集模板起作用 the same as 覆盖项目中的任何其他模板。
若要重写表单模板,必须使用 TemplatesSetting
渲染器。则覆盖表单模板起作用 the same as 覆盖项目中的任何其他模板。
若要重写字段模板,必须使用 TemplatesSetting
渲染器。则覆盖字段模板起作用 the same as 覆盖项目中的任何其他模板。
每个小部件都有一个 template_name
具有值的属性,例如 input.html
. 内置的小部件模板存储在 django/forms/widgets
路径。您可以为提供自定义模板 input.html
通过定义 django/forms/widgets/input.html
例如。见 内置小工具 每个小部件模板的名称。
要覆盖小部件模板,必须使用 TemplatesSetting
渲染器。然后覆盖小部件模板工作 the same as 覆盖项目中的任何其他模板。
7月 22, 2024