窗体呈现API

Django的窗体小部件使用Django的 template engines system .

表单呈现过程可以在多个级别进行自定义:

  • 小部件可以指定自定义模板名称。

  • 窗体和小部件可以指定自定义渲染器类。

  • 小部件的模板可以被项目覆盖。(可重用应用程序通常不应重写内置模板,因为它们可能与项目的自定义模板冲突。)

低级渲染API

表单模板的呈现由可自定义的呈现器类控制。可以通过更新 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 .

class BaseRenderer[源代码]

内置窗体呈现器的基类。

form_template_name

用于呈现表单的模板的默认名称。

默认为 "django/forms/div.html" 模板。

formset_template_name

用于呈现表单集的模板的默认名称。

默认为 "django/forms/formsets/div.html" 模板。

field_template_name
New in Django 5.0.

用于呈现 BoundField

默认为 "django/forms/field.html"

get_template(template_name)[源代码]

子类必须使用适当的模板查找逻辑实现此方法。

render(template_name, context, request=None)[源代码]

呈现给定的模板,或引发 TemplateDoesNotExist

内置模板表单呈现器

DjangoTemplates

class DjangoTemplates[源代码]

此渲染器使用独立的 DjangoTemplates 引擎(未连接到您可能在 TEMPLATES 设置)。它首先从中的内置表单模板目录加载模板 django/forms/templates 然后从安装的应用程序的模板目录中使用 app_directories 装载机。

如果要使用来自 TEMPLATES 设置,例如上下文处理器,使用 TemplatesSetting 渲染器。

class DjangoDivFormRenderer[源代码]

自 5.0 版本弃用.

的别名 DjangoTemplates

Jinja2

class Jinja2[源代码]

此呈现器与 DjangoTemplates 呈现器,除非它使用 Jinja2 后端。内置微件的模板位于 django/forms/jinja2 并且已安装的应用程序可以在 jinja2 目录。

要使用此后端,项目中的所有表单和小部件及其第三方应用程序都必须具有JJIA2模板。除非您为没有任何模板的小部件提供您自己的JJIA2模板,否则您不能使用此呈现器。例如, django.contrib.admin 由于使用了Django模板标记,所以它的窗口小部件不包含JJIA2模板。

class Jinja2DivFormRenderer[源代码]

自 5.0 版本弃用.

的别名 Jinja2

TemplatesSetting

class 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 :所有与字段无关或与隐藏字段相关的表单错误。

字段模板中提供的上下文

New in Django 5.0.

字段模板从接收上下文 BoundField.get_context() 。默认情况下,字段接收具有下列值的词典:

小部件模板中的可用上下文

小部件模板从接收上下文 Widget.get_context() . 默认情况下,小部件在上下文中接收单个值, widget . 这是一个包含如下值的字典:

  • name

  • value

  • attrs

  • is_hidden

  • template_name

一些小部件向上下文添加更多信息。例如,所有子类的小部件 Input 定义 widget['type']MultiWidget 定义 widget['subwidgets'] 用于循环。

覆盖内置表单集模板

BaseFormSet.template_name

若要重写表单集模板,必须使用 TemplatesSetting 渲染器。则覆盖表单集模板起作用 the same as 覆盖项目中的任何其他模板。

覆盖内置表单模板

Form.template_name

若要重写表单模板,必须使用 TemplatesSetting 渲染器。则覆盖表单模板起作用 the same as 覆盖项目中的任何其他模板。

覆盖内置字段模板

New in Django 5.0.

Field.template_name

若要重写字段模板,必须使用 TemplatesSetting 渲染器。则覆盖字段模板起作用 the same as 覆盖项目中的任何其他模板。

覆盖内置小部件模板

每个小部件都有一个 template_name 具有值的属性,例如 input.html . 内置的小部件模板存储在 django/forms/widgets 路径。您可以为提供自定义模板 input.html 通过定义 django/forms/widgets/input.html 例如。见 内置小工具 每个小部件模板的名称。

要覆盖小部件模板,必须使用 TemplatesSetting 渲染器。然后覆盖小部件模板工作 the same as 覆盖项目中的任何其他模板。