{"title":"表单 API","version":"4.0","locale":"zh-hans","docname":"ref/forms/api","url":"/zh-hans/4.0/ref/forms/api/","canonical":"https://djangodocs.dev/zh-hans/4.0/ref/forms/api/","summary":"一个 Form 实例要么是绑定到一组数据，要么是未绑定。如果是绑定了一组数据，它就能够验证这些数据，并将表单渲染成 HTML，并在 HTML 中显示数据。","html":"<span id=\"the-forms-api\"></span><h1>表单 API<a class=\"heading-anchor\" href=\"#module-django.forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"admonition-about-this-document admonition\" role=\"note\">\n<p class=\"admonition-title\">关于此文档</p>\n<p>本文档介绍了 Django 的表单 API 的具体细节。你应该先阅读 <a class=\"reference internal\" href=\"/zh-hans/4.0/topics/forms/\"><span class=\"doc\">使用表单的介绍</span></a>。</p>\n</aside>\n<section id=\"bound-and-unbound-forms\">\n<span id=\"ref-forms-api-bound-unbound\"></span><h2>绑定和非绑定表单<a class=\"heading-anchor\" href=\"#bound-and-unbound-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>一个 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 实例要么是 <strong>绑定</strong> 到一组数据，要么是 <strong>未绑定</strong>。</p>\n<ul class=\"simple\">\n<li><p>如果是 <strong>绑定</strong> 了一组数据，它就能够验证这些数据，并将表单渲染成 HTML，并在 HTML 中显示数据。</p></li>\n<li><p>如果是 <strong>未绑定</strong>，它就不能进行验证（因为没有数据可验证！），但它仍然可以将空白表单渲染为 HTML。</p></li>\n</ul>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Form</span><a class=\"heading-anchor\" href=\"#django.forms.Form\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>要创建一个未绑定的 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 实例，实例化类：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">()</span>\n</code></pre></div>\n<p>要将数据绑定到表单中，将数据以字典的形式传递给你的 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 类构造函数的第一个参数：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"p\">)</span>\n</code></pre></div>\n<p>在这个字典中，键是字段名，对应于 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 类中的属性。值是你要验证的数据。这些数据通常是字符串，但不要求它们是字符串；你传递的数据类型取决于 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a>，我们稍后会看到。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.is_bound\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">is_bound</span><a class=\"heading-anchor\" href=\"#django.forms.Form.is_bound\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>如果你需要在运行时区分绑定和未绑定的表单实例，请检查表单的 <a class=\"reference internal\" href=\"#django.forms.Form.is_bound\" title=\"django.forms.Form.is_bound\"><code class=\"xref py py-attr docutils literal notranslate\">is_bound</code></a> 属性的值：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>is_bound\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">({</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>is_bound\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>需要注意的是，传递一个空的字典会创建一个空数据的 <em>绑定</em> 表单：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">({})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>is_bound\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>如果你有一个绑定的 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 实例，并想以某种方式改变数据，或者你想将一个未绑定的 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 实例绑定到一些数据，请创建另一个 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 实例。没有办法改变一个 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 实例中的数据。一旦创建了一个 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 实例，你应该认为它的数据是不可改变的，不管它是否有数据。</p>\n</section>\n<section id=\"using-forms-to-validate-data\">\n<h2>使用表单来验证数据<a class=\"heading-anchor\" href=\"#using-forms-to-validate-data\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.clean\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">clean</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.clean\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>当你必须为相互依赖的字段添加自定义验证时，在你的 <code class=\"docutils literal notranslate\">Form</code> 上实现一个 <code class=\"docutils literal notranslate\">clean()</code> 方法。参见 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/validation/#validating-fields-with-clean\"><span class=\"std std-ref\">清理和验证相互依赖的字段</span></a> 的用法示例。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.is_valid\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">is_valid</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.is_valid\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 对象的主要任务是验证数据。有了一个绑定的 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 实例，调用 <a class=\"reference internal\" href=\"#django.forms.Form.is_valid\" title=\"django.forms.Form.is_valid\"><code class=\"xref py py-meth docutils literal notranslate\">is_valid()</code></a> 方法来运行验证，并返回一个布尔值，指定数据是否有效：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>is_valid<span class=\"p\">()</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>让我们用一些无效的数据试试。在这种情况下，<code class=\"docutils literal notranslate\">subject</code> 是空白的（这是一个错误，因为所有的字段都是默认的），<code class=\"docutils literal notranslate\">sender</code> 不是一个有效的电子邮件地址：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;invalid email address&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>is_valid<span class=\"p\">()</span>\n<span class=\"go\">False</span>\n</code></pre></div>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.errors\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">errors</span><a class=\"heading-anchor\" href=\"#django.forms.Form.errors\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>访问 <a class=\"reference internal\" href=\"#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\">errors</code></a> 属性来获取错误信息的字典：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>errors\n<span class=\"go\">{&#39;sender&#39;: [&#39;Enter a valid email address.&#39;], &#39;subject&#39;: [&#39;This field is required.&#39;]}</span>\n</code></pre></div>\n<p>在这个字典中，键是字段名，值是代表错误信息的字符串列表。错误信息存储在列表中，因为一个字段可以有多个错误信息。</p>\n<p>你可以访问 <a class=\"reference internal\" href=\"#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\">errors</code></a>，而不必先调用 <a class=\"reference internal\" href=\"#django.forms.Form.is_valid\" title=\"django.forms.Form.is_valid\"><code class=\"xref py py-meth docutils literal notranslate\">is_valid()</code></a>。无论是调用 <a class=\"reference internal\" href=\"#django.forms.Form.is_valid\" title=\"django.forms.Form.is_valid\"><code class=\"xref py py-meth docutils literal notranslate\">is_valid()</code></a> 还是访问 <a class=\"reference internal\" href=\"#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\">errors</code></a>，表单的数据都会首先被验证。</p>\n<p>验证例程只会被调用一次，无论你访问 <a class=\"reference internal\" href=\"#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\">errors</code></a> 或调用 <a class=\"reference internal\" href=\"#django.forms.Form.is_valid\" title=\"django.forms.Form.is_valid\"><code class=\"xref py py-meth docutils literal notranslate\">is_valid()</code></a> 多少次。这意味着，如果验证有副作用，这些副作用将只被触发一次。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.errors.as_data\">\n<span class=\"sig-prename descclassname\">Form.errors.</span><span class=\"sig-name descname\">as_data</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.errors.as_data\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回一个 <code class=\"docutils literal notranslate\">dict</code>，将字段映射到它们的原始 <code class=\"docutils literal notranslate\">ValidationError</code> 实例。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>errors<span class=\"o\">.</span>as_data<span class=\"p\">()</span>\n<span class=\"go\">{&#39;sender&#39;: [ValidationError([&#39;Enter a valid email address.&#39;])],</span>\n<span class=\"go\">&#39;subject&#39;: [ValidationError([&#39;This field is required.&#39;])]}</span>\n</code></pre></div>\n<p>当你需要通过错误 <code class=\"docutils literal notranslate\">code</code> 来识别错误时，请使用此方法。这样就可以在给定的错误出现时，重写错误信息或在视图中编写自定义逻辑。它还可以用来以自定义格式（如 XML）将错误序列化；例如， <code class=\"xref py py-meth docutils literal notranslate\">as_json()</code> 依赖于 <code class=\"docutils literal notranslate\">as_data()</code>。</p>\n<p>需要使用 <code class=\"docutils literal notranslate\">as_data()</code> 方法是由于向后兼容性。以前，<code class=\"docutils literal notranslate\">ValidationError</code> 实例一旦被添加到 <code class=\"docutils literal notranslate\">Form.errors</code> 字典中，其 <strong>渲染的</strong> 错误信息就会丢失。理想情况下，<code class=\"docutils literal notranslate\">Form.errors</code> 会存储 <code class=\"docutils literal notranslate\">ValidationError</code> 实例，并且带有 <code class=\"docutils literal notranslate\">as_</code> 前缀的方法可以渲染它们，但为了不破坏那些期望在 <code class=\"docutils literal notranslate\">Form.errors</code> 中渲染错误信息的代码，必须反过来做。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.errors.as_json\">\n<span class=\"sig-prename descclassname\">Form.errors.</span><span class=\"sig-name descname\">as_json</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">escape_html<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.errors.as_json\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回以 JSON 格式序列化的错误。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>errors<span class=\"o\">.</span>as_json<span class=\"p\">()</span>\n<span class=\"go\">{&quot;sender&quot;: [{&quot;message&quot;: &quot;Enter a valid email address.&quot;, &quot;code&quot;: &quot;invalid&quot;}],</span>\n<span class=\"go\">&quot;subject&quot;: [{&quot;message&quot;: &quot;This field is required.&quot;, &quot;code&quot;: &quot;required&quot;}]}</span>\n</code></pre></div>\n<p>默认情况下，<code class=\"docutils literal notranslate\">as_json()</code> 不会转义其输出。如果你使用它来处理类似 AJAX 请求的表单视图，客户端解释响应并将错误插入到页面中，你会希望确保在客户端转义结果，以避免跨站点脚本攻击的可能性。你可以在 JavaScript 中使用 <code class=\"docutils literal notranslate\">element.textContent = errorText</code> 或者使用 jQuery 的 <code class=\"docutils literal notranslate\">$(el).text(errorText)</code> （而不是它的 <code class=\"docutils literal notranslate\">.html()</code> 函数）来实现。</p>\n<p>如果出于某些原因你不想使用客户端转义，你也可以设置 <code class=\"docutils literal notranslate\">escape_html=True</code>，错误信息将被转义，这样你就可以直接在 HTML 中使用它们。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.errors.get_json_data\">\n<span class=\"sig-prename descclassname\">Form.errors.</span><span class=\"sig-name descname\">get_json_data</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">escape_html<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.errors.get_json_data\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"xref py py-meth docutils literal notranslate\">Form. errors.as_json()</code> 将返回序列化的 JSON，而这个则是返回序列化之前的错误数据。</p>\n<p><code class=\"docutils literal notranslate\">escape_html</code> 参数的行为如 <a class=\"reference internal\" href=\"#django.forms.Form.errors.as_json\" title=\"django.forms.Form.errors.as_json\"><code class=\"xref py py-meth docutils literal notranslate\">Form.errors.as_json()</code></a> 中所述。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.add_error\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">add_error</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">field</em>, <em class=\"sig-param\">error</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.add_error\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>该方法允许在 <code class=\"docutils literal notranslate\">Form.clean()</code> 方法中添加错误到特定字段，或者从表单外部添加错误，例如从视图中添加。</p>\n<p><code class=\"docutils literal notranslate\">field</code> 参数是应该添加错误的字段名。如果它的值是 <code class=\"docutils literal notranslate\">None</code>，错误将被视为非字段错误，就像 <a class=\"reference internal\" href=\"#django.forms.Form.non_field_errors\" title=\"django.forms.Form.non_field_errors\"><code class=\"xref py py-meth docutils literal notranslate\">Form.non_field_errors()</code></a> 返回的那样。</p>\n<p><code class=\"docutils literal notranslate\">error</code> 参数可以是一个字符串，或者最好是 <code class=\"docutils literal notranslate\">ValidationError</code> 的实例。关于定义表单错误的最佳做法，请参见 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/validation/#raising-validation-error\"><span class=\"std std-ref\">引发 ValidationError</span></a>。</p>\n<p>注意，<code class=\"docutils literal notranslate\">Form.add_error()</code> 会自动从 <code class=\"docutils literal notranslate\">cleaned_data</code> 中删除相关字段。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.has_error\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">has_error</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">field</em>, <em class=\"sig-param\">code<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.has_error\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>本方法返回一个布尔值，表示一个字段是否有特定错误 <code class=\"docutils literal notranslate\">code</code> 的错误。如果 <code class=\"docutils literal notranslate\">code</code> 是 <code class=\"docutils literal notranslate\">None</code>，如果字段包含任何错误，它将返回 <code class=\"docutils literal notranslate\">True</code>。</p>\n<p>要检查非字段错误，使用 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/exceptions/#django.core.exceptions.NON_FIELD_ERRORS\" title=\"django.core.exceptions.NON_FIELD_ERRORS\"><code class=\"xref py py-data docutils literal notranslate\">NON_FIELD_ERRORS</code></a> 作为 <code class=\"docutils literal notranslate\">field</code> 参数。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.non_field_errors\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">non_field_errors</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.non_field_errors\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>这个方法从 <a class=\"reference internal\" href=\"#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\">Form.errors</code></a> 中返回没有与特定字段关联的错误列表。这包括在 <a class=\"reference internal\" href=\"#django.forms.Form.clean\" title=\"django.forms.Form.clean\"><code class=\"xref py py-meth docutils literal notranslate\">Form.clean()</code></a> 中引发的 <code class=\"docutils literal notranslate\">ValidationError</code> 和使用 <a class=\"reference internal\" href=\"#django.forms.Form.add_error\" title=\"django.forms.Form.add_error\"><code class=\"xref py py-meth docutils literal notranslate\">Form.add_error(None, &quot;...&quot;)</code></a> 添加的错误。</p>\n<section id=\"behavior-of-unbound-forms\">\n<h3>非绑定表单的行为<a class=\"heading-anchor\" href=\"#behavior-of-unbound-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>在没有数据的情况下验证表单是没有意义的，但是，记录一下，以下是未绑定表单的情况：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>is_valid<span class=\"p\">()</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>errors\n<span class=\"go\">{}</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"initial-form-values\">\n<span id=\"ref-forms-initial-form-values\"></span><h2>初始表单值<a class=\"heading-anchor\" href=\"#initial-form-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.initial\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">initial</span><a class=\"heading-anchor\" href=\"#django.forms.Form.initial\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>使用 <a class=\"reference internal\" href=\"#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\">initial</code></a> 在运行时声明表单字段的初始值。例如，你可能想用当前会话的用户名来填写 <code class=\"docutils literal notranslate\">username</code> 字段。</p>\n<p>要实现这一目标，请使用 <a class=\"reference internal\" href=\"#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\">initial</code></a> 参数到 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a>。如果给定这个参数，它应该是一个将字段名映射到初始值的字典。只包含你要指定初始值的字段，没有必要包含表单中的每个字段。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>initial<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there!&#39;</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>这些值只对未绑定的表单显示，如果没有提供特定的值，它们不会被用作后备值。</p>\n<p>如果一个 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> 定义了 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/fields/#django.forms.Field.initial\" title=\"django.forms.Field.initial\"><code class=\"xref py py-attr docutils literal notranslate\">initial</code></a> <em>并且</em> 你在实例化 <code class=\"docutils literal notranslate\">Form</code> 时包含了 <a class=\"reference internal\" href=\"#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\">initial</code></a>，那么后者 <code class=\"docutils literal notranslate\">initial</code> 将具有优先权。在这个例子中，<code class=\"docutils literal notranslate\">initial</code> 既在字段级别又在表单实例级别提供，后者具有优先权：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">CommentForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>initial<span class=\"o\">=</span><span class=\"s1\">&#39;class&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span>    url <span class=\"o\">=</span> forms<span class=\"o\">.</span>URLField<span class=\"p\">()</span>\n<span class=\"gp\">... </span>    comment <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> CommentForm<span class=\"p\">(</span>initial<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;instance&#39;</span><span class=\"p\">},</span> auto_id<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"p\">)</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Name:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;name&quot; value=&quot;instance&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Url:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;url&quot; name=&quot;url&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Comment:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;comment&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.get_initial_for_field\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">get_initial_for_field</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">field</em>, <em class=\"sig-param\">field_name</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.get_initial_for_field\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回一个表单字段的初始数据。如果存在的话，它从 <a class=\"reference internal\" href=\"#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\">Form.initial</code></a> 检索数据，否则尝试 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/fields/#django.forms.Field.initial\" title=\"django.forms.Field.initial\"><code class=\"xref py py-attr docutils literal notranslate\">Field.initial</code></a>。可调用的值将被执行。</p>\n<p>我们推荐使用 <a class=\"reference internal\" href=\"#django.forms.BoundField.initial\" title=\"django.forms.BoundField.initial\"><code class=\"xref py py-attr docutils literal notranslate\">BoundField.initial</code></a> 而不是 <a class=\"reference internal\" href=\"#django.forms.Form.get_initial_for_field\" title=\"django.forms.Form.get_initial_for_field\"><code class=\"xref py py-meth docutils literal notranslate\">get_initial_for_field()</code></a> 因为 <code class=\"docutils literal notranslate\">BoundField.initial</code> 有一个更简单的接口。另外，不像 <a class=\"reference internal\" href=\"#django.forms.Form.get_initial_for_field\" title=\"django.forms.Form.get_initial_for_field\"><code class=\"xref py py-meth docutils literal notranslate\">get_initial_for_field()</code></a>， <a class=\"reference internal\" href=\"#django.forms.BoundField.initial\" title=\"django.forms.BoundField.initial\"><code class=\"xref py py-attr docutils literal notranslate\">BoundField.initial</code></a> 会缓存它的值。这在处理返回值是可能改变的可调用对象时尤其有用（例如，<code class=\"docutils literal notranslate\">datetime.now</code> 或 <code class=\"docutils literal notranslate\">uuid.uuid4</code>）：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span> <span class=\"nn\">uuid</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">UUIDCommentForm</span><span class=\"p\">(</span>CommentForm<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    identifier <span class=\"o\">=</span> forms<span class=\"o\">.</span>UUIDField<span class=\"p\">(</span>initial<span class=\"o\">=</span>uuid<span class=\"o\">.</span>uuid4<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> UUIDCommentForm<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>get_initial_for_field<span class=\"p\">(</span>f<span class=\"o\">.</span>fields<span class=\"p\">[</span><span class=\"s1\">&#39;identifier&#39;</span><span class=\"p\">],</span> <span class=\"s1\">&#39;identifier&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">UUID(&#39;972ca9e4-7bfe-4f5b-af7d-07b3aa306334&#39;)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>get_initial_for_field<span class=\"p\">(</span>f<span class=\"o\">.</span>fields<span class=\"p\">[</span><span class=\"s1\">&#39;identifier&#39;</span><span class=\"p\">],</span> <span class=\"s1\">&#39;identifier&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">UUID(&#39;1b411fab-844e-4dec-bd4f-e9b0495f04d0&#39;)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Using BoundField.initial, for comparison</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"p\">[</span><span class=\"s1\">&#39;identifier&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>initial\n<span class=\"go\">UUID(&#39;28a09c59-5f00-4ed9-9179-a3b074fa9c30&#39;)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"p\">[</span><span class=\"s1\">&#39;identifier&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>initial\n<span class=\"go\">UUID(&#39;28a09c59-5f00-4ed9-9179-a3b074fa9c30&#39;)</span>\n</code></pre></div>\n</section>\n<section id=\"checking-which-form-data-has-changed\">\n<h2>检查哪些表格数据已经改变<a class=\"heading-anchor\" href=\"#checking-which-form-data-has-changed\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.has_changed\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">has_changed</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.has_changed\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>当你需要检查表单数据是否与初始数据发生变化时，请使用 <code class=\"docutils literal notranslate\">has_changed()</code> 方法。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"p\">,</span> initial<span class=\"o\">=</span>data<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>has_changed<span class=\"p\">()</span>\n<span class=\"go\">False</span>\n</code></pre></div>\n<p>当表单提交后，我们会重新构建表单，并提供原始数据，以便进行对比。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> initial<span class=\"o\">=</span>data<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>has_changed<span class=\"p\">()</span>\n</code></pre></div>\n<p>如果来自 <code class=\"docutils literal notranslate\">request.POST</code> 的数据与 <a class=\"reference internal\" href=\"#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\">initial</code></a> 中提供的数据不同，那么 <code class=\"docutils literal notranslate\">has_changed()</code> 将为 <code class=\"docutils literal notranslate\">True</code>，否则为 <code class=\"docutils literal notranslate\">False</code>。结果是通过调用 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/fields/#django.forms.Field.has_changed\" title=\"django.forms.Field.has_changed\"><code class=\"xref py py-meth docutils literal notranslate\">Field.has_changed()</code></a> 对表单中的每个字段进行计算。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.changed_data\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">changed_data</span><a class=\"heading-anchor\" href=\"#django.forms.Form.changed_data\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\">changed_data</code> 属性返回表单绑定数据（通常是 <code class=\"docutils literal notranslate\">request.POST</code>）中与 <a class=\"reference internal\" href=\"#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\">initial</code></a> 中提供的数据不同的字段名列表。如果没有不同的数据，则返回一个空列表。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> initial<span class=\"o\">=</span>data<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">if</span> f<span class=\"o\">.</span>has_changed<span class=\"p\">():</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;The following fields changed: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"s2\">&quot;, &quot;</span><span class=\"o\">.</span>join<span class=\"p\">(</span>f<span class=\"o\">.</span>changed_data<span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>changed_data\n<span class=\"go\">[&#39;subject&#39;, &#39;message&#39;]</span>\n</code></pre></div>\n</section>\n<section id=\"accessing-the-fields-from-the-form\">\n<h2>访问表单中的字段<a class=\"heading-anchor\" href=\"#accessing-the-fields-from-the-form\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.fields\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">fields</span><a class=\"heading-anchor\" href=\"#django.forms.Form.fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>你可以从 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 实例的 <code class=\"docutils literal notranslate\">fields</code> 属性中访问其字段：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> row <span class=\"ow\">in</span> f<span class=\"o\">.</span>fields<span class=\"o\">.</span>values<span class=\"p\">():</span> <span class=\"nb\">print</span><span class=\"p\">(</span>row<span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">&lt;django.forms.fields.CharField object at 0x7ffaac632510&gt;</span>\n<span class=\"go\">&lt;django.forms.fields.URLField object at 0x7ffaac632f90&gt;</span>\n<span class=\"go\">&lt;django.forms.fields.CharField object at 0x7ffaac3aa050&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>fields<span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span>\n<span class=\"go\">&lt;django.forms.fields.CharField object at 0x7ffaac6324d0&gt;</span>\n</code></pre></div>\n<p>你可以改变 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 实例的字段，以改变它在表单中的显示方式：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>as_table<span class=\"p\">()</span><span class=\"o\">.</span>split<span class=\"p\">(</span><span class=\"s1\">&#39;</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"go\">&#39;&lt;tr&gt;&lt;th&gt;Name:&lt;/th&gt;&lt;td&gt;&lt;input name=&quot;name&quot; type=&quot;text&quot; value=&quot;instance&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>fields<span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>label <span class=\"o\">=</span> <span class=\"s2\">&quot;Username&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>as_table<span class=\"p\">()</span><span class=\"o\">.</span>split<span class=\"p\">(</span><span class=\"s1\">&#39;</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"go\">&#39;&lt;tr&gt;&lt;th&gt;Username:&lt;/th&gt;&lt;td&gt;&lt;input name=&quot;name&quot; type=&quot;text&quot; value=&quot;instance&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;&#39;</span>\n</code></pre></div>\n<p>请注意不要修改 <code class=\"docutils literal notranslate\">base_fields</code> 属性，因为这个修改会影响同一 Python 进程中所有后续的 <code class=\"docutils literal notranslate\">ContactForm</code> 实例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>base_fields<span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>label <span class=\"o\">=</span> <span class=\"s2\">&quot;Username&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>another_f <span class=\"o\">=</span> CommentForm<span class=\"p\">(</span>auto_id<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>another_f<span class=\"o\">.</span>as_table<span class=\"p\">()</span><span class=\"o\">.</span>split<span class=\"p\">(</span><span class=\"s1\">&#39;</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"go\">&#39;&lt;tr&gt;&lt;th&gt;Username:&lt;/th&gt;&lt;td&gt;&lt;input name=&quot;name&quot; type=&quot;text&quot; value=&quot;class&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"accessing-clean-data\">\n<h2>访问“干净的”数据<a class=\"heading-anchor\" href=\"#accessing-clean-data\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.cleaned_data\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">cleaned_data</span><a class=\"heading-anchor\" href=\"#django.forms.Form.cleaned_data\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 类中的每个字段不仅负责验证数据，还负责“清理”数据——将其规范为一致的格式。这是一个很好的功能，因为它允许以各种方式输入特定字段的数据，并总是产生一致的输出。</p>\n<p>例如， <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/fields/#django.forms.DateField\" title=\"django.forms.DateField\"><code class=\"xref py py-class docutils literal notranslate\">DateField</code></a> 将输入规范化为 Python 的 <code class=\"docutils literal notranslate\">datetime.date</code> 对象。无论你传递给它的是格式为 <code class=\"docutils literal notranslate\">'1994-07-15'</code> 的字符串，还是 <code class=\"docutils literal notranslate\">datetime.date</code> 对象，或者其他一些格式，只要它是有效的，<code class=\"docutils literal notranslate\">DateField</code> 都会将它规范化为 <code class=\"docutils literal notranslate\">datetime.date</code> 对象。</p>\n<p>当你用一组数据创建了一个 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 实例并对其进行验证后，你就可以通过它的 <code class=\"docutils literal notranslate\">cleaned_data</code> 属性来访问干净的数据：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>is_valid<span class=\"p\">()</span>\n<span class=\"go\">True</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>cleaned_data\n<span class=\"go\">{&#39;cc_myself&#39;: True, &#39;message&#39;: &#39;Hi there&#39;, &#39;sender&#39;: &#39;foo@example.com&#39;, &#39;subject&#39;: &#39;hello&#39;}</span>\n</code></pre></div>\n<p>请注意，任何基于文本的字段——如 <code class=\"docutils literal notranslate\">CharField</code> 或 <code class=\"docutils literal notranslate\">EmailField</code>——总是将输入清理成一个字符串。我们将在本文档后面介绍编码的含义。</p>\n<p>如果你的数据 <em>没有</em> 验证，<code class=\"docutils literal notranslate\">cleaned_data</code> 字典只包含有效字段：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;invalid email address&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>is_valid<span class=\"p\">()</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>cleaned_data\n<span class=\"go\">{&#39;cc_myself&#39;: True, &#39;message&#39;: &#39;Hi there&#39;}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">cleaned_data</code> 总是只包含 <code class=\"docutils literal notranslate\">Form</code> 中定义的字段的键，即使你在定义 <code class=\"docutils literal notranslate\">Form</code> 时传递了额外的数据。在这个例子中，我们传递了一堆额外的字段给 <code class=\"docutils literal notranslate\">ContactForm</code> 构造函数，但是 <code class=\"docutils literal notranslate\">cleaned_data</code> 只包含了表单的字段：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;extra_field_1&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;extra_field_2&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;bar&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;extra_field_3&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;baz&#39;</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>is_valid<span class=\"p\">()</span>\n<span class=\"go\">True</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>cleaned_data <span class=\"c1\"># Doesn&#39;t contain extra_field_1, etc.</span>\n<span class=\"go\">{&#39;cc_myself&#39;: True, &#39;message&#39;: &#39;Hi there&#39;, &#39;sender&#39;: &#39;foo@example.com&#39;, &#39;subject&#39;: &#39;hello&#39;}</span>\n</code></pre></div>\n<p>当 <code class=\"docutils literal notranslate\">Form</code> 有效时，<code class=\"docutils literal notranslate\">cleaned_data</code> 将包括 <em>所有</em> 字段的键和值，即使数据没有包括一些可选字段的值。在这个例子中，数据字典没有包含 <code class=\"docutils literal notranslate\">nick_name</code> 字段的值，但 <code class=\"docutils literal notranslate\">cleaned_data</code> 包含了它，并使用一个空值：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">OptionalPersonForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    first_name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n<span class=\"gp\">... </span>    last_name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n<span class=\"gp\">... </span>    nick_name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>required<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;first_name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;John&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;last_name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> OptionalPersonForm<span class=\"p\">(</span>data<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>is_valid<span class=\"p\">()</span>\n<span class=\"go\">True</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>cleaned_data\n<span class=\"go\">{&#39;nick_name&#39;: &#39;&#39;, &#39;first_name&#39;: &#39;John&#39;, &#39;last_name&#39;: &#39;Lennon&#39;}</span>\n</code></pre></div>\n<p>在上面这个例子中，<code class=\"docutils literal notranslate\">nick_name</code> 的 <code class=\"docutils literal notranslate\">cleaned_data</code> 值被设置为一个空字符串，因为 <code class=\"docutils literal notranslate\">nick_name</code> 是 <code class=\"docutils literal notranslate\">CharField</code>，而 <code class=\"docutils literal notranslate\">CharField</code> 将空值视为空字符串。每个字段类型都知道它的“空”值是什么——例如，对于 <code class=\"docutils literal notranslate\">DateField</code>，它是 <code class=\"docutils literal notranslate\">None</code> 而不是空字符串。关于每个字段在这种情况下的行为的全部细节，请参阅下面“内置 <code class=\"docutils literal notranslate\">Field</code> 类”一节中每个字段的“空值”说明。</p>\n<p>你可以编写代码来对特定的表单字段（基于其名称）或整个表单（考虑各种字段的组合）进行验证。更多关于这方面的信息请参见 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/validation/\"><span class=\"doc\">表单和字段验证</span></a>。</p>\n</section>\n<section id=\"outputting-forms-as-html\">\n<span id=\"ref-forms-api-outputting-html\"></span><h2>将表单输出为 HTML<a class=\"heading-anchor\" href=\"#outputting-forms-as-html\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\">Form</code> 对象的第二个任务是将其本身渲染为 HTML。为此，<code class=\"docutils literal notranslate\">print</code> 对象：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"p\">)</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot;&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n</code></pre></div>\n<p>如果表单与数据绑定，HTML 输出将适当地包含该数据。例如，如果一个字段用 <code class=\"docutils literal notranslate\">&lt;input type=&quot;text&quot;&gt;</code> 表示，数据将在 <code class=\"docutils literal notranslate\">value</code> 属性中。如果一个字段用 <code class=\"docutils literal notranslate\">&lt;input type=&quot;checkbox&quot;&gt;</code> 表示，那么 HTML 将适当地包括 <code class=\"docutils literal notranslate\">checked</code>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"p\">)</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; value=&quot;hello&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; value=&quot;Hi there&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; value=&quot;foo@example.com&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot; checked&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n</code></pre></div>\n<p>这个默认输出是一个两列的 HTML 表单，每个字段都有一个 <code class=\"docutils literal notranslate\">&lt;tr&gt;</code>。请注意以下几点：</p>\n<ul class=\"simple\">\n<li><p>为灵活起见，输出 <em>不</em> 包括 <code class=\"docutils literal notranslate\">&lt;table&gt;</code> 和 <code class=\"docutils literal notranslate\">&lt;/table&gt;</code> 标签，也不包括 <code class=\"docutils literal notranslate\">&lt;form&gt;</code> 和 <code class=\"docutils literal notranslate\">&lt;/form&gt;</code> 标签或 <code class=\"docutils literal notranslate\">&lt;input type=&quot;submit&quot;&gt;</code> 标签。这是你的工作。</p></li>\n<li><p>每个字段类型都有一个默认的 HTML 表示。<code class=\"docutils literal notranslate\">CharField</code> 用 <code class=\"docutils literal notranslate\">&lt;input type=&quot;text&quot;&gt;</code> 表示，<code class=\"docutils literal notranslate\">EmailField</code> 用 <code class=\"docutils literal notranslate\">&lt;input type=&quot;email&quot;&gt;</code> 表示。<code class=\"docutils literal notranslate\">BooleanField(null=False)</code> 由一个 <code class=\"docutils literal notranslate\">&lt;input type=&quot;checkbox&quot;&gt;</code>。请注意，这些只是合理的默认值；你可以通过使用部件来指定一个给定字段使用的 HTML，我们将在后面解释。</p></li>\n<li><p>每个标签的 HTML <code class=\"docutils literal notranslate\">name</code> 直接从 <code class=\"docutils literal notranslate\">ContactForm</code> 类中的属性名中提取。</p></li>\n<li><p>每个字段的文本标签——例如 <code class=\"docutils literal notranslate\">'Subject:'</code>、<code class=\"docutils literal notranslate\">'Message:'</code> 和 <code class=\"docutils literal notranslate\">'Cc myself:'</code>，是根据字段名将所有下划线转换为空格并将第一个字母大写而产生的。同样，请注意这些只是合理的默认值；你也可以手动指定标签。</p></li>\n<li><p>每个文本标签都被一个 HTML <code class=\"docutils literal notranslate\">&lt;label&gt;</code> 标签包围，该标签通过其 <code class=\"docutils literal notranslate\">id</code> 指向相应的表格字段。而它的 <code class=\"docutils literal notranslate\">id</code> 则是通过在字段名前加上 <code class=\"docutils literal notranslate\">'id_'</code> 生成的。<code class=\"docutils literal notranslate\">id</code> 属性和 <code class=\"docutils literal notranslate\">&lt;label&gt;</code> 标签默认包含在输出中，以遵循最佳实践，但你可以改变这种行为。</p></li>\n<li><p>输出使用 HTML5 语法，目标是 <code class=\"docutils literal notranslate\">&lt;!DOCTYPE html&gt;</code>。例如，它使用布尔属性，如 <code class=\"docutils literal notranslate\">checked</code> 而不是 XHTML 风格的 <code class=\"docutils literal notranslate\">checked='checked'</code>。</p></li>\n</ul>\n<p>虽然当你 <code class=\"docutils literal notranslate\">print</code> 表单时，<code class=\"docutils literal notranslate\">&lt;table&gt;</code> 输出是默认的输出样式，但还有其他的输出样式。每种样式都可以作为表单对象的一个方法，每个渲染方法都返回一个字符串。</p>\n<section id=\"template-name\">\n<h3><code class=\"docutils literal notranslate\">template_name</code><a class=\"heading-anchor\" href=\"#template-name\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.0</p></aside>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.template_name\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">template_name</span><a class=\"heading-anchor\" href=\"#django.forms.Form.template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>模板的名称，如果表单被转换成字符串，例如通过 <code class=\"docutils literal notranslate\">print(form)</code> 或者通过 <code class=\"docutils literal notranslate\">{{form }}</code> 在模板中被呈现。默认情况下，这个模板是 <code class=\"docutils literal notranslate\">'django/forms/default.html'</code>，它是 <code class=\"docutils literal notranslate\">'django/forms/table.html'</code> 的一个代理。模板可以通过覆盖 <code class=\"docutils literal notranslate\">template_name</code> 属性来改变每个表单，或者更广泛地通过覆盖默认模板来改变，参见 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/renderers/#overriding-built-in-form-templates\"><span class=\"std std-ref\">覆盖内置表单模板</span></a>。</p>\n</section>\n<section id=\"template-name-label\">\n<h3><code class=\"docutils literal notranslate\">template_name_label</code><a class=\"heading-anchor\" href=\"#template-name-label\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.0</p></aside>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.template_name_label\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">template_name_label</span><a class=\"heading-anchor\" href=\"#django.forms.Form.template_name_label\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>用于渲染字段的模板 <code class=\"docutils literal notranslate\">&lt;label&gt;</code>，在调用 <a class=\"reference internal\" href=\"#django.forms.BoundField.label_tag\" title=\"django.forms.BoundField.label_tag\"><code class=\"xref py py-meth docutils literal notranslate\">BoundField.label_tag()</code></a> 时使用。可以通过覆盖这个属性来改变每个表单，或者更广泛地通过覆盖默认模板来改变，也可以参见 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/renderers/#overriding-built-in-form-templates\"><span class=\"std std-ref\">覆盖内置表单模板</span></a>。</p>\n</section>\n<section id=\"as-p\">\n<h3><code class=\"docutils literal notranslate\">as_p()</code><a class=\"heading-anchor\" href=\"#as-p\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.as_p\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">as_p</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.as_p\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\">as_p()</code> 使用分配给表单 <code class=\"docutils literal notranslate\">template_name_p</code> 属性的模板渲染表单，默认这个模板是 <code class=\"docutils literal notranslate\">'django/forms/p.html'</code>。这个模板将表单渲染成一系列的 <code class=\"docutils literal notranslate\">&lt;p&gt;</code> 标签，每个 <code class=\"docutils literal notranslate\">&lt;p&gt;</code> 包含一个字段：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>as_p<span class=\"p\">()</span>\n<span class=\"go\">&#39;&lt;p&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/p&gt;\\n&lt;p&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required&gt;&lt;/p&gt;\\n&lt;p&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required&gt;&lt;/p&gt;\\n&lt;p&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot;&gt;&lt;/p&gt;&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_p<span class=\"p\">())</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot;&gt;&lt;/p&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"as-ul\">\n<h3><code class=\"docutils literal notranslate\">as_ul()</code><a class=\"heading-anchor\" href=\"#as-ul\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.as_ul\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">as_ul</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.as_ul\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\">as_ul()</code> 使用分配给表单 <code class=\"docutils literal notranslate\">template_name_ul</code> 属性的模板渲染表单，默认这个模板是 <code class=\"docutils literal notranslate\">'django/forms/ul.html'</code>。这个模板将表单渲染成一系列的 <code class=\"docutils literal notranslate\">&lt;li&gt;</code> 标签，每个 <code class=\"docutils literal notranslate\">&lt;li&gt;</code> 包含一个字段。它 <em>不</em> 包括 <code class=\"docutils literal notranslate\">&lt;ul&gt;</code> 或 <code class=\"docutils literal notranslate\">&lt;/ul&gt;</code>，这样你就可以在 <code class=\"docutils literal notranslate\">&lt;ul&gt;</code> 上指定任何 HTML 属性，以获得灵活性：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>as_ul<span class=\"p\">()</span>\n<span class=\"go\">&#39;&lt;li&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/li&gt;\\n&lt;li&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required&gt;&lt;/li&gt;\\n&lt;li&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required&gt;&lt;/li&gt;\\n&lt;li&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot;&gt;&lt;/li&gt;&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_ul<span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot;&gt;&lt;/li&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"as-table\">\n<h3><code class=\"docutils literal notranslate\">as_table()</code><a class=\"heading-anchor\" href=\"#as-table\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.as_table\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">as_table</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.as_table\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>最后，<code class=\"docutils literal notranslate\">as_table()</code> 使用分配给表单 <code class=\"docutils literal notranslate\">template_name_table</code> 属性的模板渲染表单，默认这个模板是 <code class=\"docutils literal notranslate\">'django/forms/table.html'</code>。该模板将表单输出为HTML <code class=\"docutils literal notranslate\">&lt;table&gt;</code> ：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>as_table<span class=\"p\">()</span>\n<span class=\"go\">&#39;&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;\\n&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;\\n&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;\\n&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"p\">)</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot;&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"get-context\">\n<h3><code class=\"docutils literal notranslate\">get_context()</code><a class=\"heading-anchor\" href=\"#get-context\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.0</p></aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.get_context\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">get_context</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.get_context\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回模板中表单渲染的上下文。</p>\n<p>可用的上下文：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">form</code>: 绑定表单</p></li>\n<li><p><code class=\"docutils literal notranslate\">fields</code>： 所有绑定字段，除了隐藏字段。</p></li>\n<li><p>·hidden_fields`： 所有隐藏的绑定字段。</p></li>\n<li><p><code class=\"docutils literal notranslate\">errors</code>： 所有与字段无关的或与隐藏字段有关的表单错误。</p></li>\n</ul>\n</section>\n<section id=\"render\">\n<h3><code class=\"docutils literal notranslate\">render()</code><a class=\"heading-anchor\" href=\"#render\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.0</p></aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.render\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">render</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">template_name<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">context<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">renderer<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.render\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>渲染方法被 <code class=\"docutils literal notranslate\">__str__</code> 以及 <a class=\"reference internal\" href=\"#django.forms.Form.as_table\" title=\"django.forms.Form.as_table\"><code class=\"xref py py-meth docutils literal notranslate\">Form.as_table()</code></a>、<a class=\"reference internal\" href=\"#django.forms.Form.as_p\" title=\"django.forms.Form.as_p\"><code class=\"xref py py-meth docutils literal notranslate\">Form.as_p()</code></a> 和 <a class=\"reference internal\" href=\"#django.forms.Form.as_ul\" title=\"django.forms.Form.as_ul\"><code class=\"xref py py-meth docutils literal notranslate\">Form.as_ul()</code></a> 方法调用。所有的参数都是可选的，默认为：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">template_name</code>： <a class=\"reference internal\" href=\"#django.forms.Form.template_name\" title=\"django.forms.Form.template_name\"><code class=\"xref py py-attr docutils literal notranslate\">Form.template_name</code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\">context</code>：由 <a class=\"reference internal\" href=\"#django.forms.Form.get_context\" title=\"django.forms.Form.get_context\"><code class=\"xref py py-meth docutils literal notranslate\">Form.get_context()</code></a> 返回的值</p></li>\n<li><p><code class=\"docutils literal notranslate\">renderer</code>： 由 <a class=\"reference internal\" href=\"#django.forms.Form.default_renderer\" title=\"django.forms.Form.default_renderer\"><code class=\"xref py py-attr docutils literal notranslate\">Form.default_renderer</code></a> 返回的值</p></li>\n</ul>\n</section>\n<section id=\"styling-required-or-erroneous-form-rows\">\n<span id=\"ref-forms-api-styling-form-rows\"></span><h3>样式化必填或错误的表单行<a class=\"heading-anchor\" href=\"#styling-required-or-erroneous-form-rows\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.error_css_class\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">error_css_class</span><a class=\"heading-anchor\" href=\"#django.forms.Form.error_css_class\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.required_css_class\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">required_css_class</span><a class=\"heading-anchor\" href=\"#django.forms.Form.required_css_class\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>对必填或有错误的表单行和字段进行样式设计是很常见的。例如，你可能想用粗体显示必填的表格行，用红色突出显示错误。</p>\n<p><a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 类有几个钩子，你可以用来给必填行或有错误的行添加 <code class=\"docutils literal notranslate\">class</code> 属性：设置 <a class=\"reference internal\" href=\"#django.forms.Form.error_css_class\" title=\"django.forms.Form.error_css_class\"><code class=\"xref py py-attr docutils literal notranslate\">Form.error_css_class</code></a> 和／或 <a class=\"reference internal\" href=\"#django.forms.Form.required_css_class\" title=\"django.forms.Form.required_css_class\"><code class=\"xref py py-attr docutils literal notranslate\">Form.required_css_class</code></a> 属性：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n<span class=\"k\">class</span> <span class=\"nc\">ContactForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    error_css_class <span class=\"o\">=</span> <span class=\"s1\">&#39;error&#39;</span>\n    required_css_class <span class=\"o\">=</span> <span class=\"s1\">&#39;required&#39;</span>\n\n    <span class=\"c1\"># ... and the rest of your fields here</span>\n</code></pre></div>\n<p>一旦你这样做了，根据需要，行将被赋予 <code class=\"docutils literal notranslate\">&quot;error&quot;</code> 和／或 <code class=\"docutils literal notranslate\">&quot;required&quot;</code> 类。HTML 将看起来像：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_table<span class=\"p\">())</span>\n<span class=\"go\">&lt;tr class=&quot;required&quot;&gt;&lt;th&gt;&lt;label class=&quot;required&quot; for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt;    ...</span>\n<span class=\"go\">&lt;tr class=&quot;required&quot;&gt;&lt;th&gt;&lt;label class=&quot;required&quot; for=&quot;id_message&quot;&gt;Message:&lt;/label&gt;    ...</span>\n<span class=\"go\">&lt;tr class=&quot;required error&quot;&gt;&lt;th&gt;&lt;label class=&quot;required&quot; for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt;      ...</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;label&gt; ...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>label_tag<span class=\"p\">()</span>\n<span class=\"go\">&lt;label class=&quot;required&quot; for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>label_tag<span class=\"p\">(</span>attrs<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;label for=&quot;id_subject&quot; class=&quot;foo required&quot;&gt;Subject:&lt;/label&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"configuring-form-elements-html-id-attributes-and-label-tags\">\n<span id=\"ref-forms-api-configuring-label\"></span><h3>设置表单元素的 HTML <code class=\"docutils literal notranslate\">id</code> 属性和 <code class=\"docutils literal notranslate\">&lt;label&gt;</code> 标签。<a class=\"heading-anchor\" href=\"#configuring-form-elements-html-id-attributes-and-label-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.auto_id\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">auto_id</span><a class=\"heading-anchor\" href=\"#django.forms.Form.auto_id\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>默认情况下，表单渲染方法包括：</p>\n<ul class=\"simple\">\n<li><p>表单元素的 HTML <code class=\"docutils literal notranslate\">id</code> 属性。</p></li>\n<li><p>标签周围对应的 <code class=\"docutils literal notranslate\">&lt;label&gt;</code> 标签。HTML <code class=\"docutils literal notranslate\">&lt;label&gt;</code> 标签指定了哪个标签文本与哪个表单元素相关联。这个小小的改进使表单更加可用，也更容易被辅助设备访问。使用 <code class=\"docutils literal notranslate\">&lt;label&gt;</code> 标签总是一个好主意。</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\">id</code> 属性值是通过将 <code class=\"docutils literal notranslate\">id_</code> 预置到表单字段名后生成的。 如果你想改变 <code class=\"docutils literal notranslate\">id</code> 惯例或完全删除 HTML <code class=\"docutils literal notranslate\">id</code> 属性和 <code class=\"docutils literal notranslate\">&lt;label&gt;</code> 标签，这种行为是可以设置的。</p>\n<p>使用 <code class=\"docutils literal notranslate\">Form</code> 构造函数的 <code class=\"docutils literal notranslate\">auto_id</code> 参数来控制 <code class=\"docutils literal notranslate\">id</code> 和标签行为。这个参数必须是 <code class=\"docutils literal notranslate\">True</code>、<code class=\"docutils literal notranslate\">False</code> 或一个字符串。</p>\n<p>如果 <code class=\"docutils literal notranslate\">auto_id</code> 是 <code class=\"docutils literal notranslate\">False</code>，那么表单输出将不包含 <code class=\"docutils literal notranslate\">&lt;label&gt;</code> 标签或 <code class=\"docutils literal notranslate\">id</code> 属性：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>auto_id<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_table<span class=\"p\">())</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Subject:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Message:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Sender:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Cc myself:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot;&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_ul<span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;Subject: &lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Message: &lt;input type=&quot;text&quot; name=&quot;message&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Sender: &lt;input type=&quot;email&quot; name=&quot;sender&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Cc myself: &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot;&gt;&lt;/li&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_p<span class=\"p\">())</span>\n<span class=\"go\">&lt;p&gt;Subject: &lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Message: &lt;input type=&quot;text&quot; name=&quot;message&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Sender: &lt;input type=&quot;email&quot; name=&quot;sender&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Cc myself: &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot;&gt;&lt;/p&gt;</span>\n</code></pre></div>\n<p>如果 <code class=\"docutils literal notranslate\">auto_id</code> 设置为 <code class=\"docutils literal notranslate\">True</code>，那么表单输出 <em>将</em> 包括 <code class=\"docutils literal notranslate\">&lt;label&gt;</code> 标签，并将使用字段名作为每个表单字段的 <code class=\"docutils literal notranslate\">id</code>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>auto_id<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_table<span class=\"p\">())</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;subject&quot;&gt;Subject:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;message&quot;&gt;Message:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;message&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;sender&quot;&gt;Sender:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;sender&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;cc_myself&quot;&gt;Cc myself:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;cc_myself&quot;&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_ul<span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;message&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;sender&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;cc_myself&quot;&gt;&lt;/li&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_p<span class=\"p\">())</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;message&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;sender&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;cc_myself&quot;&gt;&lt;/p&gt;</span>\n</code></pre></div>\n<p>如果 <code class=\"docutils literal notranslate\">auto_id</code> 被设置为包含格式字符 <code class=\"docutils literal notranslate\">'%s'</code> 的字符串，那么表单输出将包含 <code class=\"docutils literal notranslate\">&lt;label&gt;</code> 标签，并将根据格式字符串生成 <code class=\"docutils literal notranslate\">id</code> 属性。例如，对于格式字符串 <code class=\"docutils literal notranslate\">'field_%s'</code>，名为 <code class=\"docutils literal notranslate\">subject</code> 的字段将得到 <code class=\"docutils literal notranslate\">id</code> 值 <code class=\"docutils literal notranslate\">'field_subject'</code>。继续我们的例子：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>auto_id<span class=\"o\">=</span><span class=\"s1\">&#39;id_for_</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_table<span class=\"p\">())</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_for_subject&quot;&gt;Subject:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_for_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_for_message&quot;&gt;Message:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_for_message&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_for_sender&quot;&gt;Sender:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_for_sender&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_for_cc_myself&quot;&gt;Cc myself:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_for_cc_myself&quot;&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_ul<span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;id_for_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_for_message&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_for_sender&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_for_cc_myself&quot;&gt;&lt;/li&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_p<span class=\"p\">())</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_for_subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;id_for_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_for_message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_for_message&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_for_sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_for_sender&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_for_cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_for_cc_myself&quot;&gt;&lt;/p&gt;</span>\n</code></pre></div>\n<p>如果 <code class=\"docutils literal notranslate\">auto_id</code> 被设置为任何其他的真值——比如一个不包含 <code class=\"docutils literal notranslate\">%s</code> 的字符串——那么该库就会像 <code class=\"docutils literal notranslate\">auto_id</code> 是 <code class=\"docutils literal notranslate\">True</code> 一样。</p>\n<p>默认情况下，<code class=\"docutils literal notranslate\">auto_id</code> 被设置为字符串 <code class=\"docutils literal notranslate\">'id_%s'</code>。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.label_suffix\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">label_suffix</span><a class=\"heading-anchor\" href=\"#django.forms.Form.label_suffix\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>一个可翻译的字符串（英文默认为冒号（<code class=\"docutils literal notranslate\">:</code>）），将在渲染表格时附加在任何标签名称之后。</p>\n<p>可以使用 <code class=\"docutils literal notranslate\">label_suffix</code> 参数自定义该字符，或者完全省略：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>auto_id<span class=\"o\">=</span><span class=\"s1\">&#39;id_for_</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">,</span> label_suffix<span class=\"o\">=</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_ul<span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_subject&quot;&gt;Subject&lt;/label&gt; &lt;input id=&quot;id_for_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_message&quot;&gt;Message&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_for_message&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_sender&quot;&gt;Sender&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_for_sender&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_cc_myself&quot;&gt;Cc myself&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_for_cc_myself&quot;&gt;&lt;/li&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>auto_id<span class=\"o\">=</span><span class=\"s1\">&#39;id_for_</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">,</span> label_suffix<span class=\"o\">=</span><span class=\"s1\">&#39; -&gt;&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_ul<span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_subject&quot;&gt;Subject -&gt;&lt;/label&gt; &lt;input id=&quot;id_for_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_message&quot;&gt;Message -&gt;&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_for_message&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_sender&quot;&gt;Sender -&gt;&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_for_sender&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_cc_myself&quot;&gt;Cc myself -&gt;&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_for_cc_myself&quot;&gt;&lt;/li&gt;</span>\n</code></pre></div>\n<p>请注意，只有当标签的最后一个字符不是标点符号时，才会加上标签后缀（在英文中，这些字符是 <code class=\"docutils literal notranslate\">.</code>、<code class=\"docutils literal notranslate\">!</code>、<code class=\"docutils literal notranslate\">?</code> 或 <code class=\"docutils literal notranslate\">:</code>）。</p>\n<p>字段也可以定义自己的 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/fields/#django.forms.Field.label_suffix\" title=\"django.forms.Field.label_suffix\"><code class=\"xref py py-attr docutils literal notranslate\">label_suffix</code></a>。这将优先于 <a class=\"reference internal\" href=\"#django.forms.Form.label_suffix\" title=\"django.forms.Form.label_suffix\"><code class=\"xref py py-attr docutils literal notranslate\">Form.label_suffix</code></a>。后缀也可以在运行时使用 <code class=\"xref py py-meth docutils literal notranslate\">label_suffix()</code> 参数来覆盖。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.use_required_attribute\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">use_required_attribute</span><a class=\"heading-anchor\" href=\"#django.forms.Form.use_required_attribute\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>当设置为 <code class=\"docutils literal notranslate\">True</code> （默认）时，必填表单字段将有 <code class=\"docutils literal notranslate\">required</code> HTML 属性。</p>\n<p><a class=\"reference internal\" href=\"/zh-hans/4.0/topics/forms/formsets/\"><span class=\"doc\">表单集</span></a> 实例化表单时使用 <code class=\"docutils literal notranslate\">use_required_attribute=False</code> 以避免从表单集中添加和删除表单时浏览器验证错误。</p>\n</section>\n<section id=\"configuring-the-rendering-of-a-form-s-widgets\">\n<h3>设置表单组件的渲染方式<a class=\"heading-anchor\" href=\"#configuring-the-rendering-of-a-form-s-widgets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.default_renderer\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">default_renderer</span><a class=\"heading-anchor\" href=\"#django.forms.Form.default_renderer\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>指定 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/renderers/\"><span class=\"doc\">渲染器</span></a> 用于表单的渲染。默认值为 <code class=\"docutils literal notranslate\">None</code>，表示使用 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/settings/#std-setting-FORM_RENDERER\"><code class=\"xref std std-setting docutils literal notranslate\">FORM_RENDERER</code></a> 设置中指定的默认渲染器。</p>\n<p>你可以在声明你的表单时将其设置为一个类属性，或者使用 <code class=\"docutils literal notranslate\">Form.__init__()</code> 的 <code class=\"docutils literal notranslate\">renderer</code> 参数。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n<span class=\"k\">class</span> <span class=\"nc\">MyForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    default_renderer <span class=\"o\">=</span> MyRenderer<span class=\"p\">()</span>\n</code></pre></div>\n<p>或者：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>form <span class=\"o\">=</span> MyForm<span class=\"p\">(</span>renderer<span class=\"o\">=</span>MyRenderer<span class=\"p\">())</span>\n</code></pre></div>\n</section>\n<section id=\"notes-on-field-ordering\">\n<h3>字段顺序的注意事项<a class=\"heading-anchor\" href=\"#notes-on-field-ordering\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>在 <code class=\"docutils literal notranslate\">as_p()</code>、<code class=\"docutils literal notranslate\">as_ul()</code> 和 <code class=\"docutils literal notranslate\">as_table()</code> 快捷方式中，字段是按照你在表单类中定义的顺序显示的。例如，在 <code class=\"docutils literal notranslate\">ContactForm</code> 的例子中，字段是按照 <code class=\"docutils literal notranslate\">subject</code>、<code class=\"docutils literal notranslate\">message</code>、<code class=\"docutils literal notranslate\">sender</code>、<code class=\"docutils literal notranslate\">cc_myself</code> 的顺序定义的。要调整 HTML 输出的顺序，改变这些字段在类中的排列顺序。</p>\n<p>还有其他几种方式可以自定义顺序：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.field_order\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">field_order</span><a class=\"heading-anchor\" href=\"#django.forms.Form.field_order\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>默认情况下 <code class=\"docutils literal notranslate\">Form.field_order=None</code>，它保留了你在表单类中定义字段的顺序。如果 <code class=\"docutils literal notranslate\">field_order</code> 是一个字段名的列表，则字段按列表指定的顺序排列，其余字段按默认顺序追加。列表中未知的字段名将被忽略。这使得在子类中可以通过将字段设置为 <code class=\"docutils literal notranslate\">None</code> 来禁用字段，而不必重新定义排序。</p>\n<p>你也可以使用 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 的 <code class=\"docutils literal notranslate\">Form.field_order</code> 参数来覆盖字段顺序。如果一个 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 定义了 <a class=\"reference internal\" href=\"#django.forms.Form.field_order\" title=\"django.forms.Form.field_order\"><code class=\"xref py py-attr docutils literal notranslate\">field_order</code></a>，<em>并且</em> 你在实例化 <code class=\"docutils literal notranslate\">Form</code> 时包含了 <code class=\"docutils literal notranslate\">field_order</code>，那么后者的 <code class=\"docutils literal notranslate\">field_order</code> 将具有优先权。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.order_fields\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">order_fields</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">field_order</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.order_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>你可以在任何时候使用 <code class=\"docutils literal notranslate\">order_fields()</code> 对字段进行重新排列，字段名列表如 <a class=\"reference internal\" href=\"#django.forms.Form.field_order\" title=\"django.forms.Form.field_order\"><code class=\"xref py py-attr docutils literal notranslate\">field_order</code></a>。</p>\n</section>\n<section id=\"how-errors-are-displayed\">\n<h3>如何显示错误<a class=\"heading-anchor\" href=\"#how-errors-are-displayed\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果你渲染一个绑定的 <code class=\"docutils literal notranslate\">Form</code> 对象，渲染行为将自动运行表单的验证，如果它还没有发生，HTML 输出将包括验证错误，作为字段附近的 <code class=\"docutils literal notranslate\">&lt;ul class=&quot;errorlist&quot;&gt;</code>。错误信息的具体位置取决于你使用的输出方法：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;invalid email address&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"p\">,</span> auto_id<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_table<span class=\"p\">())</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Subject:&lt;/th&gt;&lt;td&gt;&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;This field is required.&lt;/li&gt;&lt;/ul&gt;&lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Message:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; value=&quot;Hi there&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Sender:&lt;/th&gt;&lt;td&gt;&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;Enter a valid email address.&lt;/li&gt;&lt;/ul&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; value=&quot;invalid email address&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Cc myself:&lt;/th&gt;&lt;td&gt;&lt;input checked type=&quot;checkbox&quot; name=&quot;cc_myself&quot;&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_ul<span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;This field is required.&lt;/li&gt;&lt;/ul&gt;Subject: &lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Message: &lt;input type=&quot;text&quot; name=&quot;message&quot; value=&quot;Hi there&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;Enter a valid email address.&lt;/li&gt;&lt;/ul&gt;Sender: &lt;input type=&quot;email&quot; name=&quot;sender&quot; value=&quot;invalid email address&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Cc myself: &lt;input checked type=&quot;checkbox&quot; name=&quot;cc_myself&quot;&gt;&lt;/li&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_p<span class=\"p\">())</span>\n<span class=\"go\">&lt;p&gt;&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;This field is required.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Subject: &lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Message: &lt;input type=&quot;text&quot; name=&quot;message&quot; value=&quot;Hi there&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;Enter a valid email address.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Sender: &lt;input type=&quot;email&quot; name=&quot;sender&quot; value=&quot;invalid email address&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Cc myself: &lt;input checked type=&quot;checkbox&quot; name=&quot;cc_myself&quot;&gt;&lt;/p&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"customizing-the-error-list-format\">\n<span id=\"ref-forms-error-list-format\"></span><h3>自定义错误列表格式<a class=\"heading-anchor\" href=\"#customizing-the-error-list-format\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ErrorList\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ErrorList</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">initlist<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">error_class<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">renderer<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ErrorList\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认情况下，表单使用 <code class=\"docutils literal notranslate\">django.forms.utils.ErrorList</code> 来格式化验证错误。<code class=\"docutils literal notranslate\">ErrorList</code> 是一个类似列表的对象，其中 <code class=\"docutils literal notranslate\">initlist</code> 是错误列表。此外，这个类有以下属性和方法。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ErrorList.error_class\">\n<span class=\"sig-name descname\">error_class</span><a class=\"heading-anchor\" href=\"#django.forms.ErrorList.error_class\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>渲染错误列表时要使用的 CSS 类。任何提供的类将被添加到默认的 <code class=\"docutils literal notranslate\">errorlist</code> 类中。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ErrorList.renderer\">\n<span class=\"sig-name descname\">renderer</span><a class=\"heading-anchor\" href=\"#django.forms.ErrorList.renderer\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.0</p></aside>\n<p>指定 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/renderers/\"><span class=\"doc\">渲染器</span></a> 用于 <code class=\"docutils literal notranslate\">ErrorList</code>。默认为 <code class=\"docutils literal notranslate\">None</code>，即使用由 <code class=\"xref std std-setting docutils literal notranslate\">FORM_RENDER</code> 配置指定的默认渲染器。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ErrorList.template_name\">\n<span class=\"sig-name descname\">template_name</span><a class=\"heading-anchor\" href=\"#django.forms.ErrorList.template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.0</p></aside>\n<p>调用 <code class=\"docutils literal notranslate\">__str__</code> 或 <a class=\"reference internal\" href=\"#django.forms.ErrorList.render\" title=\"django.forms.ErrorList.render\"><code class=\"xref py py-meth docutils literal notranslate\">render()</code></a> 时使用的模板名称。默认情况下，这是 <code class=\"docutils literal notranslate\">'django/forms/errors/list/default.html'</code>，它是 <code class=\"docutils literal notranslate\">'ul.html'</code> 模板的代理。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ErrorList.template_name_text\">\n<span class=\"sig-name descname\">template_name_text</span><a class=\"heading-anchor\" href=\"#django.forms.ErrorList.template_name_text\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.0</p></aside>\n<p>调用 <a class=\"reference internal\" href=\"#django.forms.ErrorList.as_text\" title=\"django.forms.ErrorList.as_text\"><code class=\"xref py py-meth docutils literal notranslate\">as_text()</code></a> 时使用的模板名称。默认是 <code class=\"docutils literal notranslate\">'django/forms/errors/list/text.html'</code>。该模板将错误显示为一个列表，其中包含了一些要点。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ErrorList.template_name_ul\">\n<span class=\"sig-name descname\">template_name_ul</span><a class=\"heading-anchor\" href=\"#django.forms.ErrorList.template_name_ul\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.0</p></aside>\n<p>调用 <a class=\"reference internal\" href=\"#django.forms.ErrorList.as_ul\" title=\"django.forms.ErrorList.as_ul\"><code class=\"xref py py-meth docutils literal notranslate\">as_ul()</code></a> 时使用的模板名称。默认情况下，这是 <code class=\"docutils literal notranslate\">'django/forms/errors/list/ul.html'</code>。这个模板在 <code class=\"docutils literal notranslate\">&lt;li&gt;</code> 标签中渲染错误，并使用 <a class=\"reference internal\" href=\"#django.forms.ErrorList.error_class\" title=\"django.forms.ErrorList.error_class\"><code class=\"xref py py-attr docutils literal notranslate\">error_class</code></a> 所定义的 CSS 类来包装 <code class=\"docutils literal notranslate\">&lt;ul&gt;</code>。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ErrorList.get_context\">\n<span class=\"sig-name descname\">get_context</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ErrorList.get_context\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.0</p></aside>\n<p>返回模板中渲染错误的上下文。</p>\n<p>可用的上下文：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">errors</code>： 一个错误列表。</p></li>\n<li><p><code class=\"docutils literal notranslate\">error_class</code>：一个 CSS 类的字符串。</p></li>\n</ul>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ErrorList.render\">\n<span class=\"sig-name descname\">render</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">template_name<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">context<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">renderer<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ErrorList.render\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.0</p></aside>\n<p>渲染方法被 <code class=\"docutils literal notranslate\">__str__</code> 以及 <a class=\"reference internal\" href=\"#django.forms.ErrorList.as_ul\" title=\"django.forms.ErrorList.as_ul\"><code class=\"xref py py-meth docutils literal notranslate\">as_ul()</code></a> 方法所调用。</p>\n<p>所有参数都是可选的，将默认为：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">template_name</code>：由 <a class=\"reference internal\" href=\"#django.forms.ErrorList.template_name\" title=\"django.forms.ErrorList.template_name\"><code class=\"xref py py-attr docutils literal notranslate\">template_name</code></a> 返回的值。</p></li>\n<li><p><code class=\"docutils literal notranslate\">context</code>： 由 <a class=\"reference internal\" href=\"#django.forms.ErrorList.get_context\" title=\"django.forms.ErrorList.get_context\"><code class=\"xref py py-meth docutils literal notranslate\">get_context()</code></a> 返回的值</p></li>\n<li><p><code class=\"docutils literal notranslate\">renderer</code>： 由 <a class=\"reference internal\" href=\"#django.forms.ErrorList.renderer\" title=\"django.forms.ErrorList.renderer\"><code class=\"xref py py-attr docutils literal notranslate\">renderer</code></a> 返回的值</p></li>\n</ul>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ErrorList.as_text\">\n<span class=\"sig-name descname\">as_text</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ErrorList.as_text\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>使用由 <a class=\"reference internal\" href=\"#django.forms.ErrorList.template_name_text\" title=\"django.forms.ErrorList.template_name_text\"><code class=\"xref py py-attr docutils literal notranslate\">template_name_text</code></a> 定义的模板渲染错误列表。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ErrorList.as_ul\">\n<span class=\"sig-name descname\">as_ul</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ErrorList.as_ul\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>使用由 <a class=\"reference internal\" href=\"#django.forms.ErrorList.template_name_ul\" title=\"django.forms.ErrorList.template_name_ul\"><code class=\"xref py py-attr docutils literal notranslate\">template_name_ul</code></a> 定义的模板渲染错误列表。</p>\n</dd></dl>\n\n<p>如果你想自定义错误的渲染，这可以通过覆盖 <a class=\"reference internal\" href=\"#django.forms.ErrorList.template_name\" title=\"django.forms.ErrorList.template_name\"><code class=\"xref py py-attr docutils literal notranslate\">template_name</code></a> 属性来实现，或者更普遍地通过覆盖默认模板来实现，也可以参见 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/renderers/#overriding-built-in-form-templates\"><span class=\"std std-ref\">覆盖内置表单模板</span></a>。</p>\n</dd></dl>\n\n<aside class=\"version-note version-changed\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 4.0</p><p><a class=\"reference internal\" href=\"#django.forms.ErrorList\" title=\"django.forms.ErrorList\"><code class=\"xref py py-class docutils literal notranslate\">ErrorList</code></a> 的渲染被移至模板引擎。</p>\n</aside>\n<aside class=\"version-note version-deprecated\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">Deprecated since Django 4.0</p><p><span class=\"versionmodified deprecated\">Deprecated since version 4.0: </span>当调用 <code class=\"docutils literal notranslate\">__str__</code> 方法时，返回 <code class=\"docutils literal notranslate\">str</code> 的能力已被弃用。使用模板引擎代替，它返回一个 <code class=\"docutils literal notranslate\">SafeString</code>。</p>\n</aside>\n</section>\n</section>\n<section id=\"more-granular-output\">\n<h2>更精细的输出<a class=\"heading-anchor\" href=\"#more-granular-output\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\">as_p()</code>、<code class=\"docutils literal notranslate\">as_ul()</code> 和 <code class=\"docutils literal notranslate\">as_table()</code> 方法都是快捷方式——它们并不是显示表单对象的唯一方式。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">BoundField</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用于显示 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 实例的单个字段的 HTML 或访问属性。</p>\n<p>该对象的 <code class=\"docutils literal notranslate\">__str__()</code> 方法显示该字段的 HTML。</p>\n</dd></dl>\n\n<p>要检索一个单一的 <code class=\"docutils literal notranslate\">BoundField</code>，在你的表单中使用字典查询语法，使用字段名作为键：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>form <span class=\"o\">=</span> ContactForm<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>form<span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;</span>\n</code></pre></div>\n<p>要检索所有的 <code class=\"docutils literal notranslate\">BoundField</code> 对象，请迭代表单：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>form <span class=\"o\">=</span> ContactForm<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> boundfield <span class=\"ow\">in</span> form<span class=\"p\">:</span> <span class=\"nb\">print</span><span class=\"p\">(</span>boundfield<span class=\"p\">)</span>\n<span class=\"go\">&lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;</span>\n<span class=\"go\">&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required&gt;</span>\n<span class=\"go\">&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required&gt;</span>\n<span class=\"go\">&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot;&gt;</span>\n</code></pre></div>\n<p>特定字段的输出尊重表单对象的 <code class=\"docutils literal notranslate\">auto_id</code> 设置：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>auto_id<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;input type=&quot;text&quot; name=&quot;message&quot; required&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>auto_id<span class=\"o\">=</span><span class=\"s1\">&#39;id_</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required&gt;</span>\n</code></pre></div>\n<section id=\"attributes-of-boundfield\">\n<h3><code class=\"docutils literal notranslate\">BoundField</code> 的属性<a class=\"heading-anchor\" href=\"#attributes-of-boundfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.auto_id\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">auto_id</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.auto_id\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">BoundField</code> 的 HTML ID 属性。如果 <a class=\"reference internal\" href=\"#django.forms.Form.auto_id\" title=\"django.forms.Form.auto_id\"><code class=\"xref py py-attr docutils literal notranslate\">Form.auto_id</code></a> 是 <code class=\"docutils literal notranslate\">False</code>，则返回一个空字符串。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.data\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">data</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.data\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>此属性返回由部件的 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/widgets/#django.forms.Widget.value_from_datadict\" title=\"django.forms.Widget.value_from_datadict\"><code class=\"xref py py-meth docutils literal notranslate\">value_from_datadict()</code></a> 方法提取的此 <a class=\"reference internal\" href=\"#django.forms.BoundField\" title=\"django.forms.BoundField\"><code class=\"xref py py-class docutils literal notranslate\">BoundField</code></a> 的数据，如果没有给定则返回 <code class=\"docutils literal notranslate\">None</code>。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>unbound_form <span class=\"o\">=</span> ContactForm<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>unbound_form<span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>data<span class=\"p\">)</span>\n<span class=\"go\">None</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>bound_form <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;My Subject&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>bound_form<span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>data<span class=\"p\">)</span>\n<span class=\"go\">My Subject</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.errors\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">errors</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.errors\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个 <a class=\"reference internal\" href=\"#ref-forms-error-list-format\"><span class=\"std std-ref\">类似列表的对象</span></a>，打印时显示为 HTML <code class=\"docutils literal notranslate\">&lt;ul class=&quot;errorlist&quot;&gt;</code>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hi&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"p\">,</span> auto_id<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;input type=&quot;text&quot; name=&quot;message&quot; required&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>errors\n<span class=\"go\">[&#39;This field is required.&#39;]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>errors<span class=\"p\">)</span>\n<span class=\"go\">&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;This field is required.&lt;/li&gt;&lt;/ul&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>errors\n<span class=\"go\">[]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>errors<span class=\"p\">)</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">str</span><span class=\"p\">(</span>f<span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>errors<span class=\"p\">)</span>\n<span class=\"go\">&#39;&#39;</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.field\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">field</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.field\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这个 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> 封装的表单类中的表单 <a class=\"reference internal\" href=\"#django.forms.BoundField\" title=\"django.forms.BoundField\"><code class=\"xref py py-class docutils literal notranslate\">BoundField</code></a> 实例。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.form\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">form</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.form\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这个 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 实例与这个 <a class=\"reference internal\" href=\"#django.forms.BoundField\" title=\"django.forms.BoundField\"><code class=\"xref py py-class docutils literal notranslate\">BoundField</code></a> 绑定。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.help_text\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">help_text</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.help_text\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>字段的 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/fields/#django.forms.Field.help_text\" title=\"django.forms.Field.help_text\"><code class=\"xref py py-attr docutils literal notranslate\">help_text</code></a>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.html_name\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">html_name</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.html_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>部件的 HTML <code class=\"docutils literal notranslate\">name</code> 属性中使用的名称。它考虑到了 <a class=\"reference internal\" href=\"#django.forms.Form.prefix\" title=\"django.forms.Form.prefix\"><code class=\"xref py py-attr docutils literal notranslate\">prefix</code></a> 的形式。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.id_for_label\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">id_for_label</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.id_for_label\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>使用这个属性来渲染这个字段的 ID。例如，如果你在你的模板中手动构建一个 <code class=\"docutils literal notranslate\">&lt;label&gt;</code> （尽管事实上 <a class=\"reference internal\" href=\"#django.forms.BoundField.label_tag\" title=\"django.forms.BoundField.label_tag\"><code class=\"xref py py-meth docutils literal notranslate\">label_tag()</code></a> 将为你做这件事）：</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">form.my_field.id_for_label</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>...<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">my_field</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>默认情况下，这将是字段的名称，前缀为 <code class=\"docutils literal notranslate\">id_</code> （上面的例子为 &quot;<code class=\"docutils literal notranslate\">id_my_field</code>&quot;）。你可以通过设置 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/widgets/#django.forms.Widget.attrs\" title=\"django.forms.Widget.attrs\"><code class=\"xref py py-attr docutils literal notranslate\">attrs</code></a> 对字段的部件进行修改。例如，声明一个字段是这样的：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>my_field <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>TextInput<span class=\"p\">(</span>attrs<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;myFIELD&#39;</span><span class=\"p\">}))</span>\n</code></pre></div>\n<p>并使用上面的模板，会呈现出这样的效果：</p>\n<div class=\"code-block\" data-language=\"html\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Html</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Html code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;myFIELD&quot;</span><span class=\"p\">&gt;</span>...<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">input</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;myFIELD&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;text&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;my_field&quot;</span> <span class=\"na\">required</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.initial\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">initial</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.initial\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>使用 <a class=\"reference internal\" href=\"#django.forms.BoundField.initial\" title=\"django.forms.BoundField.initial\"><code class=\"xref py py-attr docutils literal notranslate\">BoundField.initial</code></a> 来检索一个表单字段的初始数据。如果存在，它从 <a class=\"reference internal\" href=\"#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\">Form.initial</code></a> 检索数据，否则尝试 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/fields/#django.forms.Field.initial\" title=\"django.forms.Field.initial\"><code class=\"xref py py-attr docutils literal notranslate\">Field.initial</code></a>。值为可调用对象将被执行。参见 <a class=\"reference internal\" href=\"#ref-forms-initial-form-values\"><span class=\"std std-ref\">初始表单值</span></a> 获取更多的例子。</p>\n<p><a class=\"reference internal\" href=\"#django.forms.BoundField.initial\" title=\"django.forms.BoundField.initial\"><code class=\"xref py py-attr docutils literal notranslate\">BoundField.initial</code></a> 缓存了它的返回值，这在处理返回值可能改变的可调用对象时特别有用（例如 <code class=\"docutils literal notranslate\">datetime.now</code> 或 <code class=\"docutils literal notranslate\">uuid.uuid4</code>）：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> datetime\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">DatedCommentForm</span><span class=\"p\">(</span>CommentForm<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    created <span class=\"o\">=</span> forms<span class=\"o\">.</span>DateTimeField<span class=\"p\">(</span>initial<span class=\"o\">=</span>datetime<span class=\"o\">.</span>now<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> DatedCommentForm<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"p\">[</span><span class=\"s1\">&#39;created&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>initial\n<span class=\"go\">datetime.datetime(2021, 7, 27, 9, 5, 54)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"p\">[</span><span class=\"s1\">&#39;created&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>initial\n<span class=\"go\">datetime.datetime(2021, 7, 27, 9, 5, 54)</span>\n</code></pre></div>\n<p>建议使用 <a class=\"reference internal\" href=\"#django.forms.BoundField.initial\" title=\"django.forms.BoundField.initial\"><code class=\"xref py py-attr docutils literal notranslate\">BoundField.initial</code></a> 而不是 <a class=\"reference internal\" href=\"#django.forms.Form.get_initial_for_field\" title=\"django.forms.Form.get_initial_for_field\"><code class=\"xref py py-meth docutils literal notranslate\">get_initial_for_field()</code></a>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.is_hidden\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">is_hidden</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.is_hidden\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果这个 <a class=\"reference internal\" href=\"#django.forms.BoundField\" title=\"django.forms.BoundField\"><code class=\"xref py py-class docutils literal notranslate\">BoundField</code></a> 的部件被隐藏，返回 <code class=\"docutils literal notranslate\">True</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.label\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">label</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.label\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>字段的 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/fields/#django.forms.Field.label\" title=\"django.forms.Field.label\"><code class=\"xref py py-attr docutils literal notranslate\">label</code></a>。这在 <a class=\"reference internal\" href=\"#django.forms.BoundField.label_tag\" title=\"django.forms.BoundField.label_tag\"><code class=\"xref py py-meth docutils literal notranslate\">label_tag()</code></a> 中使用。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.name\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">name</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>表单中该字段的名称：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>name<span class=\"p\">)</span>\n<span class=\"go\">subject</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>name<span class=\"p\">)</span>\n<span class=\"go\">message</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.widget_type\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">widget_type</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.widget_type\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回包装字段的部件的小写类名，去掉后面的 <code class=\"docutils literal notranslate\">input</code> 或 <code class=\"docutils literal notranslate\">widget</code>。当构建表单时，布局取决于组件的类型时，可以使用这个方法。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">for</span> field <span class=\"ow\">in</span> form <span class=\"o\">%</span><span class=\"p\">}</span>\n    <span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">if</span> field<span class=\"o\">.</span>widget_type <span class=\"o\">==</span> <span class=\"s1\">&#39;checkbox&#39;</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n        <span class=\"c1\"># render one way</span>\n    <span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">else</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n        <span class=\"c1\"># render another way</span>\n    <span class=\"p\">{</span><span class=\"o\">%</span> endif <span class=\"o\">%</span><span class=\"p\">}</span>\n<span class=\"p\">{</span><span class=\"o\">%</span> endfor <span class=\"o\">%</span><span class=\"p\">}</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"methods-of-boundfield\">\n<h3><code class=\"docutils literal notranslate\">BoundField</code> 方法<a class=\"heading-anchor\" href=\"#methods-of-boundfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.as_hidden\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">as_hidden</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">attrs<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.as_hidden\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回将其表示为 <code class=\"docutils literal notranslate\">&lt;input type=&quot;hidden&quot;&gt;</code> 的 HTML 字符串。</p>\n<p><code class=\"docutils literal notranslate\">**kwargs</code> 传递给 <a class=\"reference internal\" href=\"#django.forms.BoundField.as_widget\" title=\"django.forms.BoundField.as_widget\"><code class=\"xref py py-meth docutils literal notranslate\">as_widget()</code></a>。</p>\n<p>这个方法主要在内部使用。你应该使用部件来代替。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.as_widget\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">as_widget</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">widget<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">attrs<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">only_initial<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.as_widget\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>通过渲染通过的部件来渲染该字段，并添加作为 <code class=\"docutils literal notranslate\">attrs</code> 传递的任何 HTML 属性。 如果没有指定部件，那么将使用该字段的默认部件。</p>\n<p><code class=\"docutils literal notranslate\">only_initial</code> 是 Django 内部使用的，不应该明确设置。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.css_classes\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">css_classes</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">extra_classes<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.css_classes\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>当你使用 Django 的渲染快捷方式时，CSS 类被用来指示必填的表单字段或包含错误的字段。如果你是手动渲染表单，你可以使用 <code class=\"docutils literal notranslate\">css_classes</code> 方法访问这些 CSS 类：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>css_classes<span class=\"p\">()</span>\n<span class=\"go\">&#39;required&#39;</span>\n</code></pre></div>\n<p>如果你想在可能需要的错误和必要的类之外提供一些额外的类，你可以提供这些类作为参数：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>css_classes<span class=\"p\">(</span><span class=\"s1\">&#39;foo bar&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;foo bar required&#39;</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.label_tag\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">label_tag</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">contents<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">attrs<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">label_suffix<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.label_tag\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>使用 <a class=\"reference internal\" href=\"#django.forms.Form.template_name_label\" title=\"django.forms.Form.template_name_label\"><code class=\"xref py py-attr docutils literal notranslate\">Form.template_name_label</code></a> 指定的模板，为表单字段渲染一个标签。</p>\n<p>可用的上下文：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">field</code>：这个 <a class=\"reference internal\" href=\"#django.forms.BoundField\" title=\"django.forms.BoundField\"><code class=\"xref py py-class docutils literal notranslate\">BoundField</code></a> 的实例。</p></li>\n<li><p><code class=\"docutils literal notranslate\">contents</code>：默认是 <a class=\"reference internal\" href=\"#django.forms.BoundField.label\" title=\"django.forms.BoundField.label\"><code class=\"xref py py-attr docutils literal notranslate\">BoundField.label</code></a> 和 <a class=\"reference internal\" href=\"#django.forms.Form.label_suffix\" title=\"django.forms.Form.label_suffix\"><code class=\"xref py py-attr docutils literal notranslate\">Form.label_suffix</code></a> （或者 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/fields/#django.forms.Field.label_suffix\" title=\"django.forms.Field.label_suffix\"><code class=\"xref py py-attr docutils literal notranslate\">Field.label_suffix</code></a>, 如果设置的话）的连接字符串。这可以被 <code class=\"docutils literal notranslate\">contents</code> 和 <code class=\"docutils literal notranslate\">label_suffix</code> 参数所覆盖。</p></li>\n<li><p><code class=\"docutils literal notranslate\">attrs</code>：一个包含 <code class=\"docutils literal notranslate\">for</code>、<a class=\"reference internal\" href=\"#django.forms.Form.required_css_class\" title=\"django.forms.Form.required_css_class\"><code class=\"xref py py-attr docutils literal notranslate\">Form.required_css_class</code></a> 和 <code class=\"docutils literal notranslate\">id</code> 的 <code class=\"docutils literal notranslate\">dict</code>。<code class=\"docutils literal notranslate\">id</code> 是由字段的部件 <code class=\"docutils literal notranslate\">attrs</code> 或 <a class=\"reference internal\" href=\"#django.forms.BoundField.auto_id\" title=\"django.forms.BoundField.auto_id\"><code class=\"xref py py-attr docutils literal notranslate\">BoundField.auto_id</code></a> 产生的。其他的属性可以由 <code class=\"docutils literal notranslate\">attrs</code> 参数提供。</p></li>\n<li><p><code class=\"docutils literal notranslate\">use_tag</code>：一个布尔值，如果标签有一个 <code class=\"docutils literal notranslate\">id</code>，则为 <code class=\"docutils literal notranslate\">True</code>。如果 <code class=\"docutils literal notranslate\">False</code>，默认模板会省略 <code class=\"docutils literal notranslate\">&lt;label&gt;</code> 标签。</p></li>\n</ul>\n<aside class=\"admonition admonition-tip\" role=\"note\">\n<p class=\"admonition-title\">Tip</p>\n<p>在你的模板中 <code class=\"docutils literal notranslate\">field</code> 是 <code class=\"docutils literal notranslate\">BoundField</code> 的实例。因此 <code class=\"docutils literal notranslate\">field.field</code> 访问 <a class=\"reference internal\" href=\"#django.forms.BoundField.field\" title=\"django.forms.BoundField.field\"><code class=\"xref py py-attr docutils literal notranslate\">BoundField.field</code></a> 是你声明的字段，例如 <code class=\"docutils literal notranslate\">forms.CharField</code>。</p>\n</aside>\n<p>要单独呈现一个表单字段的标签，可以调用它的 <code class=\"docutils literal notranslate\">label_tag()</code> 方法：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>label_tag<span class=\"p\">())</span>\n<span class=\"go\">&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt;</span>\n</code></pre></div>\n<p>如果你想自定义渲染，这可以通过覆盖 <a class=\"reference internal\" href=\"#django.forms.Form.template_name_label\" title=\"django.forms.Form.template_name_label\"><code class=\"xref py py-attr docutils literal notranslate\">Form.template_name_label</code></a> 属性来实现，或者更普遍地通过覆盖默认模板来实现，也可以参见 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/renderers/#overriding-built-in-form-templates\"><span class=\"std std-ref\">覆盖内置表单模板</span></a>。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.0\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 4.0</p><p>现在，标签已经使用模板引擎渲染了。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.value\">\n<span class=\"sig-prename descclassname\">BoundField.</span><span class=\"sig-name descname\">value</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.value\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>使用此方法渲染此字段的原始值，如同 <code class=\"docutils literal notranslate\">Widget</code>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>initial <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;welcome&#39;</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>unbound_form <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>initial<span class=\"o\">=</span>initial<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>bound_form <span class=\"o\">=</span> ContactForm<span class=\"p\">(</span>data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hi&#39;</span><span class=\"p\">},</span> initial<span class=\"o\">=</span>initial<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>unbound_form<span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>value<span class=\"p\">())</span>\n<span class=\"go\">welcome</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>bound_form<span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>value<span class=\"p\">())</span>\n<span class=\"go\">hi</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"customizing-boundfield\">\n<h2>自定义 <code class=\"docutils literal notranslate\">BoundField</code><a class=\"heading-anchor\" href=\"#customizing-boundfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>如果你需要访问模板中表单字段的一些附加信息，而使用 <a class=\"reference internal\" href=\"/zh-hans/4.0/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> 的子类还不够，也可以考虑自定义 <a class=\"reference internal\" href=\"#django.forms.BoundField\" title=\"django.forms.BoundField\"><code class=\"xref py py-class docutils literal notranslate\">BoundField</code></a>。</p>\n<p>自定义表单字段可以覆盖 <code class=\"docutils literal notranslate\">get_bound_field()</code>。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Field.get_bound_field\">\n<span class=\"sig-prename descclassname\">Field.</span><span class=\"sig-name descname\">get_bound_field</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">form</em>, <em class=\"sig-param\">field_name</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Field.get_bound_field\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>取一个 <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> 的实例和字段名。当在模板中访问该字段时，将使用返回值。它很可能是 <a class=\"reference internal\" href=\"#django.forms.BoundField\" title=\"django.forms.BoundField\"><code class=\"xref py py-class docutils literal notranslate\">BoundField</code></a> 的一个子类的实例。</p>\n</dd></dl>\n\n<p>例如，如果你有一个 <code class=\"docutils literal notranslate\">GPSCoordinatesField</code>，并希望能够在模板中访问关于坐标的附加信息，可以按以下方式实现：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">GPSCoordinatesBoundField</span><span class=\"p\">(</span>BoundField<span class=\"p\">):</span>\n    <span class=\"nd\">@property</span>\n    <span class=\"k\">def</span> <span class=\"nf\">country</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Return the country the coordinates lie in or None if it can&#39;t be</span>\n<span class=\"sd\">        determined.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        value <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>value<span class=\"p\">()</span>\n        <span class=\"k\">if</span> value<span class=\"p\">:</span>\n            <span class=\"k\">return</span> get_country_from_coordinates<span class=\"p\">(</span>value<span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">GPSCoordinatesField</span><span class=\"p\">(</span>Field<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get_bound_field</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> form<span class=\"p\">,</span> field_name<span class=\"p\">):</span>\n        <span class=\"k\">return</span> GPSCoordinatesBoundField<span class=\"p\">(</span>form<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">,</span> field_name<span class=\"p\">)</span>\n</code></pre></div>\n<p>现在你可以在模板中使用 <code class=\"docutils literal notranslate\">{{form.coordinates.country }}</code> 访问国家。</p>\n</section>\n<section id=\"binding-uploaded-files-to-a-form\">\n<span id=\"binding-uploaded-files\"></span><h2>将上传的文件绑定到表单中<a class=\"heading-anchor\" href=\"#binding-uploaded-files-to-a-form\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>处理有 <code class=\"docutils literal notranslate\">FileField</code> 和 <code class=\"docutils literal notranslate\">ImageField</code> 字段的表单比普通表单要复杂一些。</p>\n<p>首先，为了上传文件，你需要确保你的 <code class=\"docutils literal notranslate\">&lt;form&gt;</code> 元素正确地将 <code class=\"docutils literal notranslate\">enctype</code> 定义为 <code class=\"docutils literal notranslate\">&quot;multipart/form-data&quot;</code>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"o\">&lt;</span>form enctype<span class=\"o\">=</span><span class=\"s2\">&quot;multipart/form-data&quot;</span> method<span class=\"o\">=</span><span class=\"s2\">&quot;post&quot;</span> action<span class=\"o\">=</span><span class=\"s2\">&quot;/foo/&quot;</span><span class=\"o\">&gt;</span>\n</code></pre></div>\n<p>其次，当你使用表单时，你需要绑定文件数据。文件数据与普通的表单数据是分开处理的，所以当你的表单包含一个 <code class=\"docutils literal notranslate\">FileField</code> 和 <code class=\"docutils literal notranslate\">ImageField</code> 时，你需要在绑定表单时指定第二个参数。因此，如果我们扩展我们的 ContactForm，包含一个名为 <code class=\"docutils literal notranslate\">mugshot</code> 的 <code class=\"docutils literal notranslate\">ImageField</code>，我们需要绑定包含 mugshot 图片的文件数据：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Bound form with an image field</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"kn\">from</span> <span class=\"nn\">django.core.files.uploadedfile</span> <span class=\"kn\">import</span> SimpleUploadedFile\n<span class=\"o\">&gt;&gt;&gt;</span> data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"o\">...</span>         <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"o\">...</span>         <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"o\">...</span>         <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"o\">&gt;&gt;&gt;</span> file_data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;mugshot&#39;</span><span class=\"p\">:</span> SimpleUploadedFile<span class=\"p\">(</span><span class=\"s1\">&#39;face.jpg&#39;</span><span class=\"p\">,</span> <span class=\"o\">&lt;</span>file data<span class=\"o\">&gt;</span><span class=\"p\">)}</span>\n<span class=\"o\">&gt;&gt;&gt;</span> f <span class=\"o\">=</span> ContactFormWithMugshot<span class=\"p\">(</span>data<span class=\"p\">,</span> file_data<span class=\"p\">)</span>\n</code></pre></div>\n<p>在实践中，你通常会指定 <code class=\"docutils literal notranslate\">request.FILES</code> 作为文件数据的来源（就像你使用 <code class=\"docutils literal notranslate\">request.POST</code> 作为表单数据的来源一样）：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Bound form with an image field, data from the request</span>\n<span class=\"o\">&gt;&gt;&gt;</span> f <span class=\"o\">=</span> ContactFormWithMugshot<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> request<span class=\"o\">.</span>FILES<span class=\"p\">)</span>\n</code></pre></div>\n<p>构造非绑定表单的方法和以往一样——省略表单数据 <em>和</em> 文件数据：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Unbound form with an image field</span>\n<span class=\"o\">&gt;&gt;&gt;</span> f <span class=\"o\">=</span> ContactFormWithMugshot<span class=\"p\">()</span>\n</code></pre></div>\n<section id=\"testing-for-multipart-forms\">\n<h3>多部分表格的测试<a class=\"heading-anchor\" href=\"#testing-for-multipart-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.is_multipart\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">is_multipart</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.is_multipart\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>如果你正在编写可重用的视图或模板，你可能无法提前知道你的表单是否是一个多部分表单。<code class=\"docutils literal notranslate\">is_multipart()</code> 方法可以告诉你表单是否需要多部分编码来提交：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactFormWithMugshot<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>is_multipart<span class=\"p\">()</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>下面是一个如何在模板中使用的例子：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">if</span> form<span class=\"o\">.</span>is_multipart <span class=\"o\">%</span><span class=\"p\">}</span>\n    <span class=\"o\">&lt;</span>form enctype<span class=\"o\">=</span><span class=\"s2\">&quot;multipart/form-data&quot;</span> method<span class=\"o\">=</span><span class=\"s2\">&quot;post&quot;</span> action<span class=\"o\">=</span><span class=\"s2\">&quot;/foo/&quot;</span><span class=\"o\">&gt;</span>\n<span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">else</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n    <span class=\"o\">&lt;</span>form method<span class=\"o\">=</span><span class=\"s2\">&quot;post&quot;</span> action<span class=\"o\">=</span><span class=\"s2\">&quot;/foo/&quot;</span><span class=\"o\">&gt;</span>\n<span class=\"p\">{</span><span class=\"o\">%</span> endif <span class=\"o\">%</span><span class=\"p\">}</span>\n<span class=\"p\">{{</span> form <span class=\"p\">}}</span>\n<span class=\"o\">&lt;/</span>form<span class=\"o\">&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"subclassing-forms\">\n<h2>子类化表单<a class=\"heading-anchor\" href=\"#subclassing-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>如果你有多个共享字段的 <code class=\"docutils literal notranslate\">Form</code> 类，你可以使用子类来消除冗余。</p>\n<p>当你将一个自定义的 <code class=\"docutils literal notranslate\">Form</code> 类子类化时，生成的子类将包括父类的所有字段，然后是你在子类中定义的字段。</p>\n<p>在这个例子中，<code class=\"docutils literal notranslate\">ContactFormWithPriority</code> 包含了 <code class=\"docutils literal notranslate\">ContactForm</code> 的所有字段，加上一个额外的字段 <code class=\"docutils literal notranslate\">priority</code>。<code class=\"docutils literal notranslate\">ContactForm</code> 字段是按顺序排列的：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">ContactFormWithPriority</span><span class=\"p\">(</span>ContactForm<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    priority <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ContactFormWithPriority<span class=\"p\">(</span>auto_id<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>f<span class=\"o\">.</span>as_ul<span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;Subject: &lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Message: &lt;input type=&quot;text&quot; name=&quot;message&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Sender: &lt;input type=&quot;email&quot; name=&quot;sender&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Cc myself: &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot;&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Priority: &lt;input type=&quot;text&quot; name=&quot;priority&quot; required&gt;&lt;/li&gt;</span>\n</code></pre></div>\n<p>可以对多个表单进行子类化，将表单视为混搭。在这个例子中，<code class=\"docutils literal notranslate\">BeatleForm</code> 同时对 <code class=\"docutils literal notranslate\">PersonForm</code> 和 <code class=\"docutils literal notranslate\">InstrumentForm</code> 进行子类化（按顺序），它的字段列表包括父类的字段：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">PersonForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    first_name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n<span class=\"gp\">... </span>    last_name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">InstrumentForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    instrument <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">BeatleForm</span><span class=\"p\">(</span>InstrumentForm<span class=\"p\">,</span> PersonForm<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    haircut_type <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>b <span class=\"o\">=</span> BeatleForm<span class=\"p\">(</span>auto_id<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>b<span class=\"o\">.</span>as_ul<span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;First name: &lt;input type=&quot;text&quot; name=&quot;first_name&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Last name: &lt;input type=&quot;text&quot; name=&quot;last_name&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Instrument: &lt;input type=&quot;text&quot; name=&quot;instrument&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Haircut type: &lt;input type=&quot;text&quot; name=&quot;haircut_type&quot; required&gt;&lt;/li&gt;</span>\n</code></pre></div>\n<p>可以通过在子类上将字段名称设置为 &quot;<code class=\"docutils literal notranslate\">None</code>&quot; 来声明性地删除从父类继承的 <code class=\"docutils literal notranslate\">Field</code>。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">ParentForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n<span class=\"gp\">... </span>    age <span class=\"o\">=</span> forms<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">ChildForm</span><span class=\"p\">(</span>ParentForm<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    name <span class=\"o\">=</span> <span class=\"kc\">None</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">list</span><span class=\"p\">(</span>ChildForm<span class=\"p\">()</span><span class=\"o\">.</span>fields<span class=\"p\">)</span>\n<span class=\"go\">[&#39;age&#39;]</span>\n</code></pre></div>\n</section>\n<section id=\"prefixes-for-forms\">\n<span id=\"form-prefix\"></span><h2>表单前缀<a class=\"heading-anchor\" href=\"#prefixes-for-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.prefix\">\n<span class=\"sig-prename descclassname\">Form.</span><span class=\"sig-name descname\">prefix</span><a class=\"heading-anchor\" href=\"#django.forms.Form.prefix\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>你可以在一个 <code class=\"docutils literal notranslate\">&lt;form&gt;</code> 标签中放入多个 Django 表单。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>mother <span class=\"o\">=</span> PersonForm<span class=\"p\">(</span>prefix<span class=\"o\">=</span><span class=\"s2\">&quot;mother&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>father <span class=\"o\">=</span> PersonForm<span class=\"p\">(</span>prefix<span class=\"o\">=</span><span class=\"s2\">&quot;father&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>mother<span class=\"o\">.</span>as_ul<span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_mother-first_name&quot;&gt;First name:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;mother-first_name&quot; id=&quot;id_mother-first_name&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_mother-last_name&quot;&gt;Last name:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;mother-last_name&quot; id=&quot;id_mother-last_name&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>father<span class=\"o\">.</span>as_ul<span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_father-first_name&quot;&gt;First name:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;father-first_name&quot; id=&quot;id_father-first_name&quot; required&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_father-last_name&quot;&gt;Last name:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;father-last_name&quot; id=&quot;id_father-last_name&quot; required&gt;&lt;/li&gt;</span>\n</code></pre></div>\n<p>也可以在表单类上指定前缀：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">PersonForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"o\">...</span>\n<span class=\"gp\">... </span>    prefix <span class=\"o\">=</span> <span class=\"s1\">&#39;person&#39;</span>\n</code></pre></div>\n</section>","rootId":"module-django.forms","toc":[{"title":"绑定和非绑定表单","anchor":"bound-and-unbound-forms","children":[]},{"title":"使用表单来验证数据","anchor":"using-forms-to-validate-data","children":[{"title":"非绑定表单的行为","anchor":"behavior-of-unbound-forms","children":[]}]},{"title":"初始表单值","anchor":"initial-form-values","children":[]},{"title":"检查哪些表格数据已经改变","anchor":"checking-which-form-data-has-changed","children":[]},{"title":"访问表单中的字段","anchor":"accessing-the-fields-from-the-form","children":[]},{"title":"访问“干净的”数据","anchor":"accessing-clean-data","children":[]},{"title":"将表单输出为 HTML","anchor":"outputting-forms-as-html","children":[{"title":"template_name","anchor":"template-name","children":[]},{"title":"template_name_label","anchor":"template-name-label","children":[]},{"title":"as_p()","anchor":"as-p","children":[]},{"title":"as_ul()","anchor":"as-ul","children":[]},{"title":"as_table()","anchor":"as-table","children":[]},{"title":"get_context()","anchor":"get-context","children":[]},{"title":"render()","anchor":"render","children":[]},{"title":"样式化必填或错误的表单行","anchor":"styling-required-or-erroneous-form-rows","children":[]},{"title":"设置表单元素的 HTML id 属性和 <label> 标签。","anchor":"configuring-form-elements-html-id-attributes-and-label-tags","children":[]},{"title":"设置表单组件的渲染方式","anchor":"configuring-the-rendering-of-a-form-s-widgets","children":[]},{"title":"字段顺序的注意事项","anchor":"notes-on-field-ordering","children":[]},{"title":"如何显示错误","anchor":"how-errors-are-displayed","children":[]},{"title":"自定义错误列表格式","anchor":"customizing-the-error-list-format","children":[]}]},{"title":"更精细的输出","anchor":"more-granular-output","children":[{"title":"BoundField 的属性","anchor":"attributes-of-boundfield","children":[]},{"title":"BoundField 方法","anchor":"methods-of-boundfield","children":[]}]},{"title":"自定义 BoundField","anchor":"customizing-boundfield","children":[]},{"title":"将上传的文件绑定到表单中","anchor":"binding-uploaded-files-to-a-form","children":[{"title":"多部分表格的测试","anchor":"testing-for-multipart-forms","children":[]}]},{"title":"子类化表单","anchor":"subclassing-forms","children":[]},{"title":"表单前缀","anchor":"prefixes-for-forms","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/4.0/ref/"},{"docname":"ref/forms/index","title":"表单","url":"/zh-hans/4.0/ref/forms/"}],"prev":{"docname":"ref/forms/index","title":"表单","url":"/zh-hans/4.0/ref/forms/"},"next":{"docname":"ref/forms/fields","title":"表单字段","url":"/zh-hans/4.0/ref/forms/fields/"},"formats":{"html":"/zh-hans/4.0/ref/forms/api/","markdown":"/zh-hans/4.0/ref/forms/api.md","json":"/zh-hans/4.0/ref/forms/api.json"},"source":"https://github.com/django/django/blob/stable/4.0.x/docs/ref/forms/api.txt","official":"https://docs.djangoproject.com/zh-hans/4.0/ref/forms/api/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}