“Django/docs/2.2.x/ref/forms/renderers”的版本间差异
(autoload) |
小 (Page commit) |
||
第1行: | 第1行: | ||
+ | {{DISPLAYTITLE:表单渲染 API — Django 文档}} | ||
<div id="module-django.forms.renderers" class="section"> | <div id="module-django.forms.renderers" class="section"> | ||
<span id="the-form-rendering-api"></span> | <span id="the-form-rendering-api"></span> | ||
− | = | + | = 表单渲染 API = |
− | Django | + | Django 的表单小部件使用 Django 的 [[../../../topics/templates|模板引擎系统]] 呈现。 |
− | |||
− | + | 表单渲染过程可以在几个层次上进行定制: | |
− | * | + | * 部件可以指定自定义模板名称。 |
− | * | + | * 表单和部件可以指定自定义渲染器类。 |
− | * | + | * 小部件的模板可以被项目覆盖。 (可重用应用程序通常不应覆盖内置模板,因为它们可能与项目的自定义模板冲突。) |
<div id="the-low-level-render-api" class="section"> | <div id="the-low-level-render-api" class="section"> | ||
<span id="low-level-widget-render-api"></span> | <span id="low-level-widget-render-api"></span> | ||
− | == | + | == 低级渲染 API == |
− | + | 表单模板的呈现由可定制的呈现器类控制。 可以通过更新 [[#id1|:setting:`FORM_RENDERER`]] 设置来指定自定义渲染器。 它默认为 <code>'</code>[[#django.forms.renderers.DjangoTemplates|django.forms.renderers.DjangoTemplates]]<code>'</code>。 | |
− | |||
− | |||
− | <code>'</code>[[#django.forms.renderers.DjangoTemplates| | ||
− | + | 您还可以通过设置 [[../api#django.forms.Form|Form.default_renderer]] 属性或使用 [[../widgets#django.forms.Widget|Widget.render()]] 的 <code>renderer</code> 参数来提供自定义渲染器。 | |
− | [[../api#django.forms.Form| | ||
− | |||
− | + | 使用 [[#built-in-template-form-renderers|内置模板表单渲染器]] 之一或实现您自己的。 自定义渲染器必须实现 <code>render(template_name, context, request=None)</code> 方法。 它应该返回呈现的模板(作为字符串)或引发 [[../../../topics/templates#django.template|TemplateDoesNotExist]]。 | |
− | |||
− | |||
− | [[../../../topics/templates#django.template| | ||
第36行: | 第28行: | ||
<div id="built-in-template-form-renderers" class="section"> | <div id="built-in-template-form-renderers" class="section"> | ||
− | <span id=" | + | <span id="id3"></span> |
− | == | + | == 内置模板表单渲染器 == |
<div id="djangotemplates" class="section"> | <div id="djangotemplates" class="section"> | ||
− | === | + | === DjangoTemplates === |
− | ; ''class | + | ; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">DjangoTemplates</span></span> |
: | : | ||
− | + | 此渲染器使用独立的 [[../../../topics/templates#django.template.backends.django|DjangoTemplates]] 引擎(与您可能在 [[#id4|:setting:`TEMPLATES`]] 设置中配置的内容无关)。 它首先从 <code>django/forms/templates</code> 中的内置表单模板目录中加载模板,然后使用 [[../../templates/api#django.template.loaders.app_directories|app_directories]] 加载器从已安装的应用程序的模板目录中加载模板。 | |
− | [[../../../topics/templates#django.template.backends.django| | ||
− | |||
− | [[ | ||
− | |||
− | |||
− | + | 如果您想使用来自 [[#id6|:setting:`TEMPLATES`]] 设置的自定义来渲染模板,例如上下文处理器,请使用 [[#django.forms.renderers.TemplatesSetting|TemplatesSetting]] 渲染器。 | |
− | [[ | ||
− | [[#django.forms.renderers.TemplatesSetting| | ||
第61行: | 第46行: | ||
<div id="jinja2" class="section"> | <div id="jinja2" class="section"> | ||
− | === | + | === Jinja2 === |
− | ; ''class | + | ; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Jinja2</span></span> |
: | : | ||
− | + | 此渲染器与 [[#django.forms.renderers.DjangoTemplates|DjangoTemplates]] 渲染器相同,只是它使用 [[../../../topics/templates#django.template.backends.jinja2|Jinja2]] 后端。 内置小部件的模板位于 <code>django/forms/jinja2</code> 中,安装的应用程序可以在 <code>jinja2</code> 目录中提供模板。 | |
− | |||
− | |||
− | |||
− | + | 要使用此后端,您项目中的所有小部件及其第三方应用程序都必须具有 Jinja2 模板。 除非您为没有的小部件提供自己的 Jinja2 模板,否则您不能使用此渲染器。 例如,[[../../contrib/admin/index#module-django.contrib|django.contrib.admin]] 不包括 Jinja2 模板,因为它们使用了 Django 模板标签。 | |
− | |||
− | |||
− | [[../../contrib/admin/index#module-django.contrib| | ||
− | |||
第81行: | 第59行: | ||
<div id="templatessetting" class="section"> | <div id="templatessetting" class="section"> | ||
− | === | + | === TemplatesSetting === |
− | ; ''class | + | ; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TemplatesSetting</span></span> |
: | : | ||
− | + | 此渲染器使您可以完全控制小部件模板的来源。 它使用 [[../../../topics/templates#django.template.loader|get_template()]] 根据 [[#id8|:setting:`TEMPLATES`]] 设置中的配置来查找小部件模板。 | |
− | |||
− | |||
− | + | 使用这个渲染器和内置的部件模板有以下两种方式: | |
<ul> | <ul> | ||
− | <li><p><code>'django.forms'</code> | + | <li><p><code>'django.forms'</code>在 [[#id10|:设置:`INSTALLED_APPS`]] 和至少一台发动机 [[#id12|:设置:`APP_DIRS =真 `]] .</p></li> |
− | + | <li><p>在中添加内置小部件模板目录 [[#id14|:setting:`目录 `]] 您的模板引擎之一。 要生成该路径:</p> | |
− | <li><p> | ||
<div class="highlight-default notranslate"> | <div class="highlight-default notranslate"> | ||
<div class="highlight"> | <div class="highlight"> | ||
− | < | + | <syntaxhighlight lang="python">import django |
− | django.__path__[0] + '/forms/templates' # or '/forms/jinja2'</ | + | django.__path__[0] + '/forms/templates' # or '/forms/jinja2'</syntaxhighlight> |
</div> | </div> | ||
第107行: | 第82行: | ||
</div></li></ul> | </div></li></ul> | ||
− | + | 使用这个渲染器需要你确保你的项目所需的表单模板可以被找到。 | |
− | |||
第116行: | 第90行: | ||
<div id="context-available-in-widget-templates" class="section"> | <div id="context-available-in-widget-templates" class="section"> | ||
− | == | + | == 部件模板中可用的上下文 == |
− | + | 小部件模板从 [[../widgets#django.forms.Widget|Widget.get_context()]] 接收上下文。 默认情况下,小部件在上下文中接收单个值,<code>widget</code>。 这是一个包含以下值的字典: | |
− | |||
− | |||
* <code>name</code> | * <code>name</code> | ||
第128行: | 第100行: | ||
* <code>template_name</code> | * <code>template_name</code> | ||
− | + | 一些小部件向上下文添加更多信息。 例如,所有子类 <code>Input</code> 定义 <code>widget['type']</code> 和 [[../widgets#django.forms|MultiWidget]] 定义 <code>widget['subwidgets']</code> 用于循环目的的小部件。 | |
− | |||
− | |||
第136行: | 第106行: | ||
<div id="overriding-built-in-widget-templates" class="section"> | <div id="overriding-built-in-widget-templates" class="section"> | ||
− | <span id=" | + | <span id="id16"></span> |
− | == | + | == 覆盖内置部件模板 == |
− | + | 每个小部件都有一个 <code>template_name</code> 属性,其值为 <code>input.html</code>。 内置小部件模板存储在 <code>django/forms/widgets</code> 路径中。 例如,您可以通过定义 <code>django/forms/widgets/input.html</code> 为 <code>input.html</code> 提供自定义模板。 有关每个小部件模板的名称,请参阅 [[../widgets#built-in-widgets|内置小部件]] 。 | |
− | <code>input.html</code> | ||
− | <code>django/forms/widgets</code> | ||
− | <code>input.html</code> | ||
− | |||
− | + | 要覆盖小部件模板,您必须使用 [[#django.forms.renderers.TemplatesSetting|TemplatesSetting]] 渲染器。 然后覆盖小部件模板的工作方式 [[../../../howto/overriding-templates|与覆盖项目中的任何其他模板的]] 相同。 | |
− | |||
第152行: | 第117行: | ||
</div> | </div> | ||
+ | <div class="clearer"> | ||
− | [[Category:Django 2.2.x | + | |
+ | |||
+ | </div> | ||
+ | |||
+ | [[Category:Django 2.2.x 文档]] |
2021年10月31日 (日) 04:05的最新版本
表单渲染 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` 设置中的配置来查找小部件模板。
使用这个渲染器和内置的部件模板有以下两种方式:
'django.forms'
在 :设置:`INSTALLED_APPS` 和至少一台发动机 :设置:`APP_DIRS =真 ` .在中添加内置小部件模板目录 :setting:`目录 ` 您的模板引擎之一。 要生成该路径:
使用这个渲染器需要你确保你的项目所需的表单模板可以被找到。
部件模板中可用的上下文
小部件模板从 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.html
为 input.html
提供自定义模板。 有关每个小部件模板的名称,请参阅 内置小部件 。
要覆盖小部件模板,您必须使用 TemplatesSetting 渲染器。 然后覆盖小部件模板的工作方式 与覆盖项目中的任何其他模板的 相同。