“Django/docs/2.2.x/ref/forms/renderers”的版本间差异

来自菜鸟教程
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>
= The form rendering API =
+
= 表单渲染 API =
  
Django's form widgets are rendered using Django's [[../../../topics/templates|<span class="doc">template engines
+
Django 的表单小部件使用 Django [[../../../topics/templates|模板引擎系统]] 呈现。
system</span>]].
 
  
The form rendering process can be customized at several levels:
+
表单渲染过程可以在几个层次上进行定制:
  
* Widgets can specify custom template names.
+
* 部件可以指定自定义模板名称。
* Forms and widgets can specify custom renderer classes.
+
* 表单和部件可以指定自定义渲染器类。
* A widget's template can be overridden by a project. (Reusable applications typically shouldn't override built-in templates because they might conflict with a project's custom 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>
== The low-level render API ==
+
== 低级渲染 API ==
  
The rendering of form templates is controlled by a customizable renderer class.
+
表单模板的呈现由可定制的呈现器类控制。 可以通过更新 [[#id1|:setting:`FORM_RENDERER`]] 设置来指定自定义渲染器。 它默认为 <code>'</code>[[#django.forms.renderers.DjangoTemplates|django.forms.renderers.DjangoTemplates]]<code>'</code>
A custom renderer can be specified by updating the [[../../settings#std-setting-FORM_RENDERER|<code>FORM_RENDERER</code>]]
 
setting. It defaults to
 
<code>'</code>[[#django.forms.renderers.DjangoTemplates|<code>django.forms.renderers.DjangoTemplates</code>]]<code>'</code>.
 
  
You can also provide a custom renderer by setting the
+
您还可以通过设置 [[../api#django.forms.Form|Form.default_renderer]] 属性或使用 [[../widgets#django.forms.Widget|Widget.render()]] 的 <code>renderer</code> 参数来提供自定义渲染器。
[[../api#django.forms.Form|<code>Form.default_renderer</code>]] attribute or by using the <code>renderer</code> argument
 
of [[../widgets#django.forms.Widget|<code>Widget.render()</code>]].
 
  
Use one of the [[#built-in-template-form-renderers|<span class="std std-ref">built-in template form renderers</span>]] or implement your own. Custom renderers
+
使用 [[#built-in-template-form-renderers|内置模板表单渲染器]] 之一或实现您自己的。 自定义渲染器必须实现 <code>render(template_name, context, request=None)</code> 方法。 它应该返回呈现的模板(作为字符串)或引发 [[../../../topics/templates#django.template|TemplateDoesNotExist]]
must implement a <code>render(template_name, context, request=None)</code> method. It
 
should return a rendered templates (as a string) or raise
 
[[../../../topics/templates#django.template|<code>TemplateDoesNotExist</code>]].
 
  
  
第36行: 第28行:
 
<div id="built-in-template-form-renderers" class="section">
 
<div id="built-in-template-form-renderers" class="section">
  
<span id="id1"></span>
+
<span id="id3"></span>
== Built-in-template form renderers ==
+
== 内置模板表单渲染器 ==
  
 
<div id="djangotemplates" class="section">
 
<div id="djangotemplates" class="section">
  
=== <code>DjangoTemplates</code> ===
+
=== DjangoTemplates ===
  
; ''class'' <code>DjangoTemplates</code>[[../../_modules/django/forms/renderers.html#DjangoTemplates|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">DjangoTemplates</span></span>
 
:  
 
:  
  
This renderer uses a standalone
+
此渲染器使用独立的 [[../../../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|<code>DjangoTemplates</code>]]
 
engine (unconnected to what you might have configured in the
 
[[../../settings#std-setting-TEMPLATES|<code>TEMPLATES</code>]] setting). It loads templates first from the built-in form
 
templates directory in <code>django/forms/templates</code> and then from the installed
 
apps' templates directories using the [[../../templates/api#django.template.loaders.app_directories|<code>app_directories</code>]] loader.
 
  
If you want to render templates with customizations from your
+
如果您想使用来自 [[#id6|:setting:`TEMPLATES`]] 设置的自定义来渲染模板,例如上下文处理器,请使用 [[#django.forms.renderers.TemplatesSetting|TemplatesSetting]] 渲染器。
[[../../settings#std-setting-TEMPLATES|<code>TEMPLATES</code>]] setting, such as context processors for example, use the
 
[[#django.forms.renderers.TemplatesSetting|<code>TemplatesSetting</code>]] renderer.
 
  
  
第61行: 第46行:
 
<div id="jinja2" class="section">
 
<div id="jinja2" class="section">
  
=== <code>Jinja2</code> ===
+
=== Jinja2 ===
  
; ''class'' <code>Jinja2</code>[[../../_modules/django/forms/renderers.html#Jinja2|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Jinja2</span></span>
 
:  
 
:  
  
This renderer is the same as the [[#django.forms.renderers.DjangoTemplates|<code>DjangoTemplates</code>]] renderer except that
+
此渲染器与 [[#django.forms.renderers.DjangoTemplates|DjangoTemplates]] 渲染器相同,只是它使用 [[../../../topics/templates#django.template.backends.jinja2|Jinja2]] 后端。 内置小部件的模板位于 <code>django/forms/jinja2</code> 中,安装的应用程序可以在 <code>jinja2</code> 目录中提供模板。
it uses a [[../../../topics/templates#django.template.backends.jinja2|<code>Jinja2</code>]] backend. Templates
 
for the built-in widgets are located in <code>django/forms/jinja2</code> and installed
 
apps can provide templates in a <code>jinja2</code> directory.
 
  
To use this backend, all the widgets in your project and its third-party apps
+
要使用此后端,您项目中的所有小部件及其第三方应用程序都必须具有 Jinja2 模板。 除非您为没有的小部件提供自己的 Jinja2 模板,否则您不能使用此渲染器。 例如,[[../../contrib/admin/index#module-django.contrib|django.contrib.admin]] 不包括 Jinja2 模板,因为它们使用了 Django 模板标签。
must have Jinja2 templates. Unless you provide your own Jinja2 templates for
 
widgets that don't have any, you can't use this renderer. For example,
 
[[../../contrib/admin/index#module-django.contrib|<code>django.contrib.admin</code>]] doesn't include Jinja2 templates for its widgets
 
due to their usage of Django template tags.
 
  
  
第81行: 第59行:
 
<div id="templatessetting" class="section">
 
<div id="templatessetting" class="section">
  
=== <code>TemplatesSetting</code> ===
+
=== TemplatesSetting ===
  
; ''class'' <code>TemplatesSetting</code>[[../../_modules/django/forms/renderers.html#TemplatesSetting|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TemplatesSetting</span></span>
 
:  
 
:  
  
This renderer gives you complete control of how widget templates are sourced.
+
此渲染器使您可以完全控制小部件模板的来源。 它使用 [[../../../topics/templates#django.template.loader|get_template()]] 根据 [[#id8|:setting:`TEMPLATES`]] 设置中的配置来查找小部件模板。
It uses [[../../../topics/templates#django.template.loader|<code>get_template()</code>]] to find widget
 
templates based on what's configured in the [[../../settings#std-setting-TEMPLATES|<code>TEMPLATES</code>]] setting.
 
  
Using this renderer along with the built-in widget templates requires either:
+
使用这个渲染器和内置的部件模板有以下两种方式:
  
 
<ul>
 
<ul>
<li><p><code>'django.forms'</code> in [[../../settings#std-setting-INSTALLED_APPS|<code>INSTALLED_APPS</code>]] and at least one engine
+
<li><p><code>'django.forms'</code>[[#id10|:设置:`INSTALLED_APPS`]] 和至少一台发动机 [[#id12|:设置:`APP_DIRS =真 `]] .</p></li>
with [[../../settings#std-setting-TEMPLATES-APP_DIRS|<code>APP_DIRS=True</code>]].</p></li>
+
<li><p>在中添加内置小部件模板目录 [[#id14|:setting:`目录 `]] 您的模板引擎之一。 要生成该路径:</p>
<li><p>Adding the built-in widgets templates directory in [[../../settings#std-setting-TEMPLATES-DIRS|<code>DIRS</code>]] of one of your template engines. To generate that path:</p>
 
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
  
 
<div class="highlight">
 
<div class="highlight">
  
<pre>import django
+
<syntaxhighlight lang="python">import django
django.__path__[0] + '/forms/templates'  # or '/forms/jinja2'</pre>
+
django.__path__[0] + '/forms/templates'  # or '/forms/jinja2'</syntaxhighlight>
  
 
</div>
 
</div>
第107行: 第82行:
 
</div></li></ul>
 
</div></li></ul>
  
Using this renderer requires you to make sure the form templates your project
+
使用这个渲染器需要你确保你的项目所需的表单模板可以被找到。
needs can be located.
 
  
  
第116行: 第90行:
 
<div id="context-available-in-widget-templates" class="section">
 
<div id="context-available-in-widget-templates" class="section">
  
== Context available in widget templates ==
+
== 部件模板中可用的上下文 ==
  
Widget templates receive a context from [[../widgets#django.forms.Widget|<code>Widget.get_context()</code>]]. By
+
小部件模板从 [[../widgets#django.forms.Widget|Widget.get_context()]] 接收上下文。 默认情况下,小部件在上下文中接收单个值,<code>widget</code>。 这是一个包含以下值的字典:
default, widgets receive a single value in the context, <code>widget</code>. This is a
 
dictionary that contains values like:
 
  
 
* <code>name</code>
 
* <code>name</code>
第128行: 第100行:
 
* <code>template_name</code>
 
* <code>template_name</code>
  
Some widgets add further information to the context. For instance, all widgets
+
一些小部件向上下文添加更多信息。 例如,所有子类 <code>Input</code> 定义 <code>widget['type']</code> [[../widgets#django.forms|MultiWidget]] 定义 <code>widget['subwidgets']</code> 用于循环目的的小部件。
that subclass <code>Input</code> defines <code>widget['type']</code> and [[../widgets#django.forms|<code>MultiWidget</code>]]
 
defines <code>widget['subwidgets']</code> for looping purposes.
 
  
  
第136行: 第106行:
 
<div id="overriding-built-in-widget-templates" class="section">
 
<div id="overriding-built-in-widget-templates" class="section">
  
<span id="id2"></span>
+
<span id="id16"></span>
== Overriding built-in widget templates ==
+
== 覆盖内置部件模板 ==
  
Each widget has a <code>template_name</code> attribute with a value such as
+
每个小部件都有一个 <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>. Built-in widget templates are stored in the
 
<code>django/forms/widgets</code> path. You can provide a custom template for
 
<code>input.html</code> by defining <code>django/forms/widgets/input.html</code>, for example.
 
See [[../widgets#built-in-widgets|<span class="std std-ref">Built-in widgets</span>]] for the name of each widget's template.
 
  
To override widget templates, you must use the [[#django.forms.renderers.TemplatesSetting|<code>TemplatesSetting</code>]]
+
要覆盖小部件模板,您必须使用 [[#django.forms.renderers.TemplatesSetting|TemplatesSetting]] 渲染器。 然后覆盖小部件模板的工作方式 [[../../../howto/overriding-templates|与覆盖项目中的任何其他模板的]] 相同。
renderer. Then overriding widget templates works [[../../../howto/overriding-templates|<span class="doc">the same as</span>]] overriding any other template in your project.
 
  
  
第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` 设置中的配置来查找小部件模板。

使用这个渲染器和内置的部件模板有以下两种方式:

使用这个渲染器需要你确保你的项目所需的表单模板可以被找到。


部件模板中可用的上下文

小部件模板从 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 渲染器。 然后覆盖小部件模板的工作方式 与覆盖项目中的任何其他模板的 相同。