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"
用于表示整个项目的表单字段的默认类。
默认为 BoundField 课
这可以使用进一步定制 Form.bound_field_class 对于每个表单覆盖,或 Field.bound_field_class 用于每个字段覆盖。
呈现给定的模板,或引发 TemplateDoesNotExist 。
DjangoTemplates¶此渲染器使用独立的 DjangoTemplates 引擎(未连接到您可能在 TEMPLATES 设置)。它首先从中的内置表单模板目录加载模板 django/forms/templates 然后从安装的应用程序的模板目录中使用 app_directories 装载机。
如果要使用来自 TEMPLATES 设置,例如上下文处理器,使用 TemplatesSetting 渲染器。
Jinja2¶此呈现器与 DjangoTemplates 呈现器,除非它使用 Jinja2 后端。内置微件的模板位于 django/forms/jinja2 并且已安装的应用程序可以在 jinja2 目录。
要使用此后端,项目中的所有表单和小部件及其第三方应用程序都必须具有JJIA2模板。除非您为没有任何模板的小部件提供您自己的JJIA2模板,否则您不能使用此呈现器。例如, django.contrib.admin 由于使用了Django模板标记,所以它的窗口小部件不包含JJIA2模板。
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 覆盖项目中的任何其他模板。
5月 28, 2025