表单渲染 API — Django 文档

来自菜鸟教程
Django/docs/3.2.x/ref/forms/renderers
跳转至:导航、​搜索

表单渲染 API

Django 的表单小部件使用 Django 的 模板引擎系统 呈现。

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

  • 小部件可以指定自定义模板名称。
  • 表单和小部件可以指定自定义渲染器类。
  • 小部件的模板可以被项目覆盖。 (可重用应用程序通常不应覆盖内置模板,因为它们可能与项目的自定义模板冲突。)

低级渲染 API

表单模板的呈现由可定制的呈现器类控制。 可以通过更新 :setting:`FORM_RENDERER` 设置来指定自定义渲染器。 它默认为 'django.forms.renderers.DjangoTemplates'

您还可以通过设置 Form.default_renderer 属性或使用 Widget.render()renderer 参数来提供自定义渲染器。

使用 内置模板表单渲染器 之一或实现您自己的。 自定义渲染器必须实现 render(template_name, context, request=None) 方法。 它应该返回呈现的模板(作为字符串)或引发 TemplateDoesNotExist


内置模板表单渲染器

DjangoTemplates

class DjangoTemplates

此渲染器使用独立的 DjangoTemplates 引擎(与您可能在 :setting:`TEMPLATES` 设置中配置的内容无关)。 它首先从 django/forms/templates 中的内置表单模板目录中加载模板,然后使用 app_directories 加载器从已安装的应用程序的模板目录中加载模板。

如果您想使用来自 :setting:`TEMPLATES` 设置的自定义来渲染模板,例如上下文处理器,请使用 TemplatesSetting 渲染器。


Jinja2

class Jinja2

此渲染器与 DjangoTemplates 渲染器相同,只是它使用 Jinja2 后端。 内置小部件的模板位于 django/forms/jinja2 中,安装的应用程序可以在 jinja2 目录中提供模板。

要使用此后端,您项目中的所有小部件及其第三方应用程序都必须具有 Jinja2 模板。 除非您为没有的小部件提供自己的 Jinja2 模板,否则您不能使用此渲染器。 例如,django.contrib.admin 不包括 Jinja2 模板,因为它们使用了 Django 模板标签。


TemplatesSetting

class TemplatesSetting

此渲染器使您可以完全控制小部件模板的来源。 它使用 get_template() 根据 :setting:`TEMPLATES` 设置中的配置来查找小部件模板。

将此渲染器与内置小部件模板一起使用需要:

使用此渲染器需要您确保可以找到您的项目所需的表单模板。


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

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

  • name
  • value
  • attrs
  • is_hidden
  • template_name

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


覆盖内置小部件模板

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

要覆盖小部件模板,您必须使用 TemplatesSetting 渲染器。 然后覆盖小部件模板的工作方式 与覆盖项目中的任何其他模板的 相同。