{"title":"表单字段","version":"3.2","locale":"zh-hans","docname":"ref/forms/fields","url":"/zh-hans/3.2/ref/forms/fields/","canonical":"https://djangodocs.dev/zh-hans/3.2/ref/forms/fields/","summary":"当你创建一个 Form 类时，最重要的部分是定义表单的字段。每个字段都有自定义的验证逻辑，以及其他一些钩子。","html":"<span id=\"form-fields\"></span><h1>表单字段<a class=\"heading-anchor\" href=\"#module-django.forms.fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Field\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Field</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Field\"><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> 类时，最重要的部分是定义表单的字段。每个字段都有自定义的验证逻辑，以及其他一些钩子。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Field.clean\">\n<span class=\"sig-prename descclassname\">Field.</span><span class=\"sig-name descname\">clean</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">value</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Field.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\">Field</code> 类的主要方式是在 <code class=\"docutils literal notranslate\">Form</code> 类中，但你也可以将它们实例化并直接使用，以更好地了解它们的工作方式。每个 <code class=\"docutils literal notranslate\">Field</code> 实例都有一个 <code class=\"docutils literal notranslate\">clean()</code> 方法，它接收一个参数，并引发一个 <code class=\"docutils literal notranslate\">django.core.exceptions.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><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> forms<span class=\"o\">.</span>EmailField<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;foo@example.com&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"s1\">&#39;invalid email address&#39;</span><span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">ValidationError</span>: [&#39;Enter a valid email address.&#39;]\n</code></pre></div>\n<section id=\"core-field-arguments\">\n<span id=\"id1\"></span><h2>核心字段参数<a class=\"heading-anchor\" href=\"#core-field-arguments\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>每个 <code class=\"docutils literal notranslate\">Field</code> 类的构造函数至少需要这些参数。有些 <code class=\"docutils literal notranslate\">Field</code> 类需要额外的、特定的字段参数，但以下参数应 <em>始终</em> 接受：</p>\n<section id=\"required\">\n<h3><code class=\"docutils literal notranslate\">required</code><a class=\"heading-anchor\" href=\"#required\"><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.Field.required\">\n<span class=\"sig-prename descclassname\">Field.</span><span class=\"sig-name descname\">required</span><a class=\"heading-anchor\" href=\"#django.forms.Field.required\"><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\">Field</code> 类都假定值是必填的，所以如果你传递一个空值—— <code class=\"docutils literal notranslate\">None</code> 或空字符串（<code class=\"docutils literal notranslate\">&quot;&quot;</code>）——那么 <code class=\"docutils literal notranslate\">clean()</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><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"gp\">&gt;&gt;&gt; </span>f <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>clean<span class=\"p\">(</span><span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;foo&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">ValidationError</span>: [&#39;This field is required.&#39;]\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">ValidationError</span>: [&#39;This field is required.&#39;]\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"s1\">&#39; &#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39; &#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;0&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;True&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;False&#39;</span>\n</code></pre></div>\n<p>要指定一个字段是 <em>不必填</em> 的，传递 <code class=\"docutils literal notranslate\">required=False</code> 给 <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>f <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>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;foo&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;0&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;True&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;False&#39;</span>\n</code></pre></div>\n<p>如果一个 <code class=\"docutils literal notranslate\">Field</code> 有 <code class=\"docutils literal notranslate\">required=False</code>，而你给 <code class=\"docutils literal notranslate\">clean()</code> 传递一个空值，那么 <code class=\"docutils literal notranslate\">clean()</code> 将返回一个 <em>规范化</em> 的空值，而不是引发 <code class=\"docutils literal notranslate\">ValidationError</code>。对于 <code class=\"docutils literal notranslate\">CharField</code>，将返回 <a class=\"reference internal\" href=\"#django.forms.CharField.empty_value\" title=\"django.forms.CharField.empty_value\"><code class=\"xref py py-attr docutils literal notranslate\">empty_value</code></a>，默认为一个空字符串。对于其他 <code class=\"docutils literal notranslate\">Field</code> 类，它可能是 <code class=\"docutils literal notranslate\">None</code>。（这因字段而异。）</p>\n<p>必填表单字段的部件有 <code class=\"docutils literal notranslate\">required</code> HTML 属性。将 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/api/#django.forms.Form.use_required_attribute\" title=\"django.forms.Form.use_required_attribute\"><code class=\"xref py py-attr docutils literal notranslate\">Form.use_required_attribute</code></a> 属性设置为 <code class=\"docutils literal notranslate\">False</code> 就可以禁用。由于在添加和删除表单集时，浏览器的验证可能不正确，所以表单集的表单中不包含 <code class=\"docutils literal notranslate\">required</code> 属性。</p>\n</section>\n<section id=\"label\">\n<h3><code class=\"docutils literal notranslate\">label</code><a class=\"heading-anchor\" href=\"#label\"><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.Field.label\">\n<span class=\"sig-prename descclassname\">Field.</span><span class=\"sig-name descname\">label</span><a class=\"heading-anchor\" href=\"#django.forms.Field.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\">label</code> 参数让你指定该字段的“人类友好”标签。当 <code class=\"docutils literal notranslate\">Field</code> 在 <code class=\"docutils literal notranslate\">Form</code> 中显示时，会用到这个标签。</p>\n<p>如上文“将表格输出为 HTML”中所解释的，<code class=\"docutils literal notranslate\">Field</code> 的默认标签是由字段名通过将所有下划线转换为空格并将第一个字母大写而生成的。如果默认行为不能产生一个适当的标签，请指定 <code class=\"docutils literal notranslate\">label</code>。</p>\n<p>这是一个完整的 <code class=\"docutils literal notranslate\">Form</code> 例子，它的两个字段实现了 <code class=\"docutils literal notranslate\">label</code>。我们指定 <code class=\"docutils literal notranslate\">auto_id=False</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>label<span class=\"o\">=</span><span class=\"s1\">&#39;Your name&#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>label<span class=\"o\">=</span><span class=\"s1\">&#39;Your website&#39;</span><span class=\"p\">,</span> required<span class=\"o\">=</span><span class=\"kc\">False</span><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>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;Your name:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;name&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Your website:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;url&quot; name=&quot;url&quot;&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</section>\n<section id=\"label-suffix\">\n<h3><code class=\"docutils literal notranslate\">label_suffix</code><a class=\"heading-anchor\" href=\"#label-suffix\"><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.Field.label_suffix\">\n<span class=\"sig-prename descclassname\">Field.</span><span class=\"sig-name descname\">label_suffix</span><a class=\"heading-anchor\" href=\"#django.forms.Field.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\">label_suffix</code> 参数可以让你在每个字段的基础上覆盖表单的 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/api/#django.forms.Form.label_suffix\" title=\"django.forms.Form.label_suffix\"><code class=\"xref py py-attr docutils literal notranslate\">label_suffix</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><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<span class=\"gp\">... </span>    age <span class=\"o\">=</span> forms<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n<span class=\"gp\">... </span>    nationality <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n<span class=\"gp\">... </span>    captcha_answer <span class=\"o\">=</span> forms<span class=\"o\">.</span>IntegerField<span class=\"p\">(</span>label<span class=\"o\">=</span><span class=\"s1\">&#39;2 + 2&#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>f <span class=\"o\">=</span> ContactForm<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_p<span class=\"p\">())</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_age&quot;&gt;Age?&lt;/label&gt; &lt;input id=&quot;id_age&quot; name=&quot;age&quot; type=&quot;number&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_nationality&quot;&gt;Nationality?&lt;/label&gt; &lt;input id=&quot;id_nationality&quot; name=&quot;nationality&quot; type=&quot;text&quot; required&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_captcha_answer&quot;&gt;2 + 2 =&lt;/label&gt; &lt;input id=&quot;id_captcha_answer&quot; name=&quot;captcha_answer&quot; type=&quot;number&quot; required&gt;&lt;/p&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"initial\">\n<h3><code class=\"docutils literal notranslate\">initial</code><a class=\"heading-anchor\" href=\"#initial\"><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.Field.initial\">\n<span class=\"sig-prename descclassname\">Field.</span><span class=\"sig-name descname\">initial</span><a class=\"heading-anchor\" href=\"#django.forms.Field.initial\"><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\">initial</code> 参数让你指定在未绑定的 <code class=\"docutils literal notranslate\">Form</code> 中渲染这个 <code class=\"docutils literal notranslate\">Field</code> 时要使用的初始值。</p>\n<p>要指定动态初始数据，请参见 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/api/#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\">Form.initial</code></a> 参数。</p>\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=\"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;Your name&#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>initial<span class=\"o\">=</span><span class=\"s1\">&#39;http://&#39;</span><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>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;Your name&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; value=&quot;http://&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<p>你可能会想，为什么不在显示表单时传递一个初始值的字典作为数据呢？好吧，如果你这样做，你会触发验证，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><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>\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>default_data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Your name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;url&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;http://&#39;</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> CommentForm<span class=\"p\">(</span>default_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>\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;Your name&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;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;Enter a valid URL.&lt;/li&gt;&lt;/ul&gt;&lt;input type=&quot;url&quot; name=&quot;url&quot; value=&quot;http://&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;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;comment&quot; required&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n</code></pre></div>\n<p>这就是为什么 <code class=\"docutils literal notranslate\">initial</code> 值只在未绑定的表单中显示。对于绑定的表格，HTML 输出将使用绑定的数据。</p>\n<p>还请注意，<code class=\"docutils literal notranslate\">initial</code> 值在验证中 <em>不</em> 用作“后备”数据，如果某个字段的值没有给出。<code class=\"docutils literal notranslate\">initial</code> 值 <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><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;Your name&#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>initial<span class=\"o\">=</span><span class=\"s1\">&#39;http://&#39;</span><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>data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;url&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;comment&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Foo&#39;</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> CommentForm<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=\"go\"># The form does *not* fall back to using the initial values.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>errors\n<span class=\"go\">{&#39;url&#39;: [&#39;This field is required.&#39;], &#39;name&#39;: [&#39;This field is 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><span class=\"kn\">import</span> <span class=\"nn\">datetime</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">DateForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    day <span class=\"o\">=</span> forms<span class=\"o\">.</span>DateField<span class=\"p\">(</span>initial<span class=\"o\">=</span>datetime<span class=\"o\">.</span>date<span class=\"o\">.</span>today<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>DateForm<span class=\"p\">())</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Day:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;day&quot; value=&quot;12/23/2008&quot; required&gt;&lt;td&gt;&lt;/tr&gt;</span>\n</code></pre></div>\n<p>只有在显示未绑定的表单时，而不是在定义表单时，才会对可调用对象表单执行。</p>\n</section>\n<section id=\"widget\">\n<h3><code class=\"docutils literal notranslate\">widget</code><a class=\"heading-anchor\" href=\"#widget\"><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.Field.widget\">\n<span class=\"sig-prename descclassname\">Field.</span><span class=\"sig-name descname\">widget</span><a class=\"heading-anchor\" href=\"#django.forms.Field.widget\"><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\">widget</code> 参数让你指定一个 <code class=\"docutils literal notranslate\">Widget</code> 类，以便在渲染这个 <code class=\"docutils literal notranslate\">Field</code> 时使用。参见 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/\"><span class=\"doc\">部件</span></a> 了解更多信息。</p>\n</section>\n<section id=\"help-text\">\n<h3><code class=\"docutils literal notranslate\">help_text</code><a class=\"heading-anchor\" href=\"#help-text\"><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.Field.help_text\">\n<span class=\"sig-prename descclassname\">Field.</span><span class=\"sig-name descname\">help_text</span><a class=\"heading-anchor\" href=\"#django.forms.Field.help_text\"><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\">help_text</code> 参数让你为这个 <code class=\"docutils literal notranslate\">Field</code> 指定描述性文本。如果你提供了 <code class=\"docutils literal notranslate\">help_text</code>，当 <code class=\"docutils literal notranslate\">Field</code> 被一个方便的 <code class=\"docutils literal notranslate\">Form</code> 方法（例如 <code class=\"docutils literal notranslate\">as_ul()</code>）渲染时，它将显示在 <code class=\"docutils literal notranslate\">Field`</code> 旁边。</p>\n<p>就像模型字段的 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/fields/#django.db.models.Field.help_text\" title=\"django.db.models.Field.help_text\"><code class=\"xref py py-attr docutils literal notranslate\">help_text</code></a> 一样，这个值在自动生成的表单中并没有被 HTML 封装。</p>\n<p>这里是一个完整的例子 <code class=\"docutils literal notranslate\">Form</code>，它的两个字段实现了 <code class=\"docutils literal notranslate\">help_text</code>。我们指定 <code class=\"docutils literal notranslate\">auto_id=False</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\">HelpTextContactForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    subject <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">,</span> help_text<span class=\"o\">=</span><span class=\"s1\">&#39;100 characters max.&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span>    message <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n<span class=\"gp\">... </span>    sender <span class=\"o\">=</span> forms<span class=\"o\">.</span>EmailField<span class=\"p\">(</span>help_text<span class=\"o\">=</span><span class=\"s1\">&#39;A valid email address, please.&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span>    cc_myself <span class=\"o\">=</span> forms<span class=\"o\">.</span>BooleanField<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>f <span class=\"o\">=</span> HelpTextContactForm<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;br&gt;&lt;span class=&quot;helptext&quot;&gt;100 characters max.&lt;/span&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;br&gt;A valid email address, please.&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;span class=&quot;helptext&quot;&gt;100 characters max.&lt;/span&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; A valid email address, please.&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;span class=&quot;helptext&quot;&gt;100 characters max.&lt;/span&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; A valid email address, please.&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</section>\n<section id=\"error-messages\">\n<h3><code class=\"docutils literal notranslate\">error_messages</code><a class=\"heading-anchor\" href=\"#error-messages\"><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.Field.error_messages\">\n<span class=\"sig-prename descclassname\">Field.</span><span class=\"sig-name descname\">error_messages</span><a class=\"heading-anchor\" href=\"#django.forms.Field.error_messages\"><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\">error_messages</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>generic <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>generic<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n  <span class=\"c\">...</span>\n<span class=\"gr\">ValidationError</span>: [&#39;This field is required.&#39;]\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>name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>error_messages<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;required&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Please enter your name&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>name<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n  <span class=\"c\">...</span>\n<span class=\"gr\">ValidationError</span>: [&#39;Please enter your name&#39;]\n</code></pre></div>\n<p>在下面的 <a class=\"reference internal\" href=\"#built-in-field-classes\">内置字段类</a> 一节中，每个 <code class=\"docutils literal notranslate\">Field</code> 定义了它所使用的错误信息键。</p>\n</section>\n<section id=\"validators\">\n<h3><code class=\"docutils literal notranslate\">validators</code><a class=\"heading-anchor\" href=\"#validators\"><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.Field.validators\">\n<span class=\"sig-prename descclassname\">Field.</span><span class=\"sig-name descname\">validators</span><a class=\"heading-anchor\" href=\"#django.forms.Field.validators\"><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\">validators</code> 参数让你为这个字段提供一个验证函数列表。</p>\n<p>更多信息请参见 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/\"><span class=\"doc\">验证器文档</span></a>。</p>\n</section>\n<section id=\"localize\">\n<h3><code class=\"docutils literal notranslate\">localize</code><a class=\"heading-anchor\" href=\"#localize\"><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.Field.localize\">\n<span class=\"sig-prename descclassname\">Field.</span><span class=\"sig-name descname\">localize</span><a class=\"heading-anchor\" href=\"#django.forms.Field.localize\"><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\">localize</code> 参数可以实现表单数据输入和渲染输出的本地化。</p>\n<p>更多信息请参见 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/i18n/formatting/\"><span class=\"doc\">格式本地化</span></a> 文档。</p>\n</section>\n<section id=\"disabled\">\n<h3><code class=\"docutils literal notranslate\">disabled</code><a class=\"heading-anchor\" href=\"#disabled\"><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.Field.disabled\">\n<span class=\"sig-prename descclassname\">Field.</span><span class=\"sig-name descname\">disabled</span><a class=\"heading-anchor\" href=\"#django.forms.Field.disabled\"><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\">disabled</code> 布尔参数设置为 <code class=\"docutils literal notranslate\">True</code> 时，使用 <code class=\"docutils literal notranslate\">disabled</code> HTML 属性禁用表单字段，使其不能被用户编辑。即使用户篡改了提交给服务器的字段值，也会被忽略，而采用表单初始数据的值。</p>\n</section>\n</section>\n<section id=\"checking-if-the-field-data-has-changed\">\n<h2>检查字段数据是否有变化<a class=\"heading-anchor\" href=\"#checking-if-the-field-data-has-changed\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"has-changed\">\n<h3><code class=\"docutils literal notranslate\">has_changed()</code><a class=\"heading-anchor\" href=\"#has-changed\"><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.Field.has_changed\">\n<span class=\"sig-prename descclassname\">Field.</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.Field.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> 方法用于确定字段值是否与初始值发生了变化。返回 <code class=\"docutils literal notranslate\">True</code> 或 <code class=\"docutils literal notranslate\">False</code>。</p>\n<p>更多信息请参见 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/api/#django.forms.Form.has_changed\" title=\"django.forms.Form.has_changed\"><code class=\"xref py py-class docutils literal notranslate\">Form.has_changed()</code></a> 文档。</p>\n</section>\n</section>\n<section id=\"built-in-field-classes\">\n<span id=\"built-in-fields\"></span><h2>内置 <code class=\"docutils literal notranslate\">Field</code> 类<a class=\"heading-anchor\" href=\"#built-in-field-classes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>当然，<code class=\"docutils literal notranslate\">forms</code> 库附带了一组 <code class=\"docutils literal notranslate\">Field</code> 类，代表了常见的验证需求。本节将对每个内置字段进行说明。</p>\n<p>对于每个字段，我们描述了在你没有指定 <code class=\"docutils literal notranslate\">widget</code> 时使用的默认部件。我们还指定了当你提供一个空值时返回的值（参见上文 <code class=\"docutils literal notranslate\">required</code> 一节以了解其含义）。</p>\n<section id=\"booleanfield\">\n<h3><code class=\"docutils literal notranslate\">BooleanField</code><a class=\"heading-anchor\" href=\"#booleanfield\"><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.BooleanField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">BooleanField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.BooleanField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.CheckboxInput\" title=\"django.forms.CheckboxInput\"><code class=\"xref py py-class docutils literal notranslate\">CheckboxInput</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">False</code></p></li>\n<li><p>规范化为：Python 的 <code class=\"docutils literal notranslate\">True</code> 或 <code class=\"docutils literal notranslate\">False</code> 值。</p></li>\n<li><p>如果字段有 <code class=\"docutils literal notranslate\">required=True</code>，则验证该值是否为 <code class=\"docutils literal notranslate\">True</code> （例如，复选框被选中）。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code></p></li>\n</ul>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>由于所有 <code class=\"docutils literal notranslate\">Field</code> 子类默认都有 <code class=\"docutils literal notranslate\">required=True</code>，这里的验证条件很重要。如果你想在你的表单中包含一个布尔值，这个布尔值可以是 <code class=\"docutils literal notranslate\">True</code> 或 <code class=\"docutils literal notranslate\">False</code> （例如一个选中或未选中的复选框），你必须记得在创建 <code class=\"docutils literal notranslate\">BooleanField</code> 时传递 <code class=\"docutils literal notranslate\">required=False</code>。</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"charfield\">\n<h3><code class=\"docutils literal notranslate\">CharField</code><a class=\"heading-anchor\" href=\"#charfield\"><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.CharField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">CharField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.CharField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a></p></li>\n<li><p>空值：不管你给 <a class=\"reference internal\" href=\"#django.forms.CharField.empty_value\" title=\"django.forms.CharField.empty_value\"><code class=\"xref py py-attr docutils literal notranslate\">empty_value</code></a> 的是什么。</p></li>\n<li><p>规范化为：一个字符串。</p></li>\n<li><p>如果提供了 <code class=\"docutils literal notranslate\">max_length</code> 和 <code class=\"docutils literal notranslate\">min_length</code>，则使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.MaxLengthValidator\" title=\"django.core.validators.MaxLengthValidator\"><code class=\"xref py py-class docutils literal notranslate\">MaxLengthValidator</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.MinLengthValidator\" title=\"django.core.validators.MinLengthValidator\"><code class=\"xref py py-class docutils literal notranslate\">MinLengthValidator</code></a>。否则，所有输入都有效。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">max_length</code>、<code class=\"docutils literal notranslate\">min_length</code></p></li>\n</ul>\n<p>需要四个可选参数进行验证：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.CharField.max_length\">\n<span class=\"sig-name descname\">max_length</span><a class=\"heading-anchor\" href=\"#django.forms.CharField.max_length\"><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.CharField.min_length\">\n<span class=\"sig-name descname\">min_length</span><a class=\"heading-anchor\" href=\"#django.forms.CharField.min_length\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果提供了这些参数，这些参数确保字符串的长度最多或至少是给定的长度。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.CharField.strip\">\n<span class=\"sig-name descname\">strip</span><a class=\"heading-anchor\" href=\"#django.forms.CharField.strip\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果 <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.CharField.empty_value\">\n<span class=\"sig-name descname\">empty_value</span><a class=\"heading-anchor\" href=\"#django.forms.CharField.empty_value\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用来表示“空”的值。默认为空字符串。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"choicefield\">\n<h3><code class=\"docutils literal notranslate\">ChoiceField</code><a class=\"heading-anchor\" href=\"#choicefield\"><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.ChoiceField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ChoiceField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ChoiceField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.Select\" title=\"django.forms.Select\"><code class=\"xref py py-class docutils literal notranslate\">Select</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">''</code> （空字符串）</p></li>\n<li><p>规范化为：一个字符串。</p></li>\n<li><p>验证给定值是否存在于选择列表中。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid_choice</code></p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\">invalid_choice</code> 错误信息可能包含 <code class=\"docutils literal notranslate\">%(value)s</code>，该信息将被替换为选定的选择。</p>\n<p>需要一个额外的参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ChoiceField.choices\">\n<span class=\"sig-name descname\">choices</span><a class=\"heading-anchor\" href=\"#django.forms.ChoiceField.choices\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>或者是一个 <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-iterable\" title=\"(in Python v3.14)\"><span class=\"xref std std-term\">iterable</span></a> 的二元元组作为这个字段的选择，或者是一个 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/fields/#field-choices-enum-types\"><span class=\"std std-ref\">enumeration</span></a> 的选择，或者是一个返回这样一个迭代器的可调用对象。这个参数接受的格式与模型字段的 <code class=\"docutils literal notranslate\">choices</code> 参数相同。更多细节请参见 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/fields/#field-choices\"><span class=\"std std-ref\">模型字段引用文档中的选择</span></a>。如果这个参数是可调用的，那么除了在渲染过程中，每次初始化字段的表单时，它都会被执行。默认为空列表。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"typedchoicefield\">\n<h3><code class=\"docutils literal notranslate\">TypedChoiceField</code><a class=\"heading-anchor\" href=\"#typedchoicefield\"><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.TypedChoiceField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">TypedChoiceField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.TypedChoiceField\"><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.ChoiceField\" title=\"django.forms.ChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ChoiceField</code></a> 一样，除了 <a class=\"reference internal\" href=\"#django.forms.TypedChoiceField\" title=\"django.forms.TypedChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">TypedChoiceField</code></a> 需要两个额外的参数 <a class=\"reference internal\" href=\"#django.forms.TypedChoiceField.coerce\" title=\"django.forms.TypedChoiceField.coerce\"><code class=\"xref py py-attr docutils literal notranslate\">coerce</code></a> 和 <a class=\"reference internal\" href=\"#django.forms.TypedChoiceField.empty_value\" title=\"django.forms.TypedChoiceField.empty_value\"><code class=\"xref py py-attr docutils literal notranslate\">empty_value</code></a>。</p>\n<ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.Select\" title=\"django.forms.Select\"><code class=\"xref py py-class docutils literal notranslate\">Select</code></a></p></li>\n<li><p>空值：不管你给 <a class=\"reference internal\" href=\"#django.forms.TypedChoiceField.empty_value\" title=\"django.forms.TypedChoiceField.empty_value\"><code class=\"xref py py-attr docutils literal notranslate\">empty_value</code></a> 的是什么。</p></li>\n<li><p>规范化为：<a class=\"reference internal\" href=\"#django.forms.TypedChoiceField.coerce\" title=\"django.forms.TypedChoiceField.coerce\"><code class=\"xref py py-attr docutils literal notranslate\">coerce</code></a> 参数提供的类型的值。</p></li>\n<li><p>验证给定的值是否存在于选择列表中，并且可以被强制执行。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid_choice</code></p></li>\n</ul>\n<p>需要额外的参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.TypedChoiceField.coerce\">\n<span class=\"sig-name descname\">coerce</span><a class=\"heading-anchor\" href=\"#django.forms.TypedChoiceField.coerce\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>接受一个参数并返回一个强制值的函数。例子包括内置的 <code class=\"docutils literal notranslate\">int</code>、<code class=\"docutils literal notranslate\">float</code>、<code class=\"docutils literal notranslate\">bool</code> 和其他类型。默认为身份函数。请注意，强制执行发生在输入验证之后，所以可以强制执行到一个不存在于``choices``中的值。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.TypedChoiceField.empty_value\">\n<span class=\"sig-name descname\">empty_value</span><a class=\"heading-anchor\" href=\"#django.forms.TypedChoiceField.empty_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\">None</code> 是另一种常见的选择。请注意，这个值不会被 <code class=\"docutils literal notranslate\">coerce</code> 参数中给出的函数强制执行，所以要据此选择。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"datefield\">\n<h3><code class=\"docutils literal notranslate\">DateField</code><a class=\"heading-anchor\" href=\"#datefield\"><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.DateField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">DateField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.DateField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.DateInput\" title=\"django.forms.DateInput\"><code class=\"xref py py-class docutils literal notranslate\">DateInput</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：Python 的 <code class=\"docutils literal notranslate\">datetime.date</code> 对象。</p></li>\n<li><p>验证给定值是 <code class=\"docutils literal notranslate\">datetime.date</code>、<code class=\"docutils literal notranslate\">datetime.datetime</code> 或以特定日期格式化的字符串。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code></p></li>\n</ul>\n<p>需要一个可选的参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.DateField.input_formats\">\n<span class=\"sig-name descname\">input_formats</span><a class=\"heading-anchor\" href=\"#django.forms.DateField.input_formats\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用于将字符串转换为有效的 <code class=\"docutils literal notranslate\">datetime.date</code> 对象的格式列表。</p>\n</dd></dl>\n\n<p>如果没有提供 <code class=\"docutils literal notranslate\">input_formats</code> 参数，如果 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/settings/#std-setting-USE_L10N\"><code class=\"xref std std-setting docutils literal notranslate\">USE_L10N</code></a> 为 <code class=\"docutils literal notranslate\">False</code>，则默认输入格式来自 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/settings/#std-setting-DATE_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\">DATE_INPUT_FORMATS</code></a>，如果启用了本地化，则默认输入格式来自激活的的本地格式 <code class=\"docutils literal notranslate\">DATE_INPUT_FORMATS</code> 键。也请参见 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/i18n/formatting/\"><span class=\"doc\">格式本地化</span></a>。</p>\n</dd></dl>\n\n</section>\n<section id=\"datetimefield\">\n<h3><code class=\"docutils literal notranslate\">DateTimeField</code><a class=\"heading-anchor\" href=\"#datetimefield\"><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.DateTimeField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">DateTimeField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.DateTimeField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.DateTimeInput\" title=\"django.forms.DateTimeInput\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeInput</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：Python 的 <code class=\"docutils literal notranslate\">datetime.datetime</code> 对象。</p></li>\n<li><p>验证给定的值是 <code class=\"docutils literal notranslate\">datetime.datetime</code>、<code class=\"docutils literal notranslate\">datetime.date</code> 或以特定日期时间格式化的字符串。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code></p></li>\n</ul>\n<p>需要一个可选的参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.DateTimeField.input_formats\">\n<span class=\"sig-name descname\">input_formats</span><a class=\"heading-anchor\" href=\"#django.forms.DateTimeField.input_formats\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>除 ISO 8601 格式外，还列出了用于将字符串转换为有效的 <code class=\"docutils literal notranslate\">datetime.datetime</code> 对象的格式。</p>\n</dd></dl>\n\n<p>该字段总是接受 ISO 8601 格式的日期或类似的 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/utils/#django.utils.dateparse.parse_datetime\" title=\"django.utils.dateparse.parse_datetime\"><code class=\"xref py py-func docutils literal notranslate\">parse_datetime()</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=\"o\">*</span> <span class=\"s1\">&#39;2006-10-25 14:30:59&#39;</span>\n<span class=\"o\">*</span> <span class=\"s1\">&#39;2006-10-25T14:30:59&#39;</span>\n<span class=\"o\">*</span> <span class=\"s1\">&#39;2006-10-25 14:30&#39;</span>\n<span class=\"o\">*</span> <span class=\"s1\">&#39;2006-10-25T14:30&#39;</span>\n<span class=\"o\">*</span> <span class=\"s1\">&#39;2006-10-25T14:30Z&#39;</span>\n<span class=\"o\">*</span> <span class=\"s1\">&#39;2006-10-25T14:30+02:00&#39;</span>\n<span class=\"o\">*</span> <span class=\"s1\">&#39;2006-10-25&#39;</span>\n</code></pre></div>\n<p>如果没有提供 <code class=\"docutils literal notranslate\">input_formats</code> 参数，默认的输入格式来自 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/settings/#std-setting-DATETIME_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\">DATETIME_INPUT_FORMATS</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/settings/#std-setting-DATE_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\">DATE_INPUT_FORMATS</code></a>，如果: setting:USE_L10N 为 <code class=\"docutils literal notranslate\">False</code>，如果启用了本地化，则从激活的本地格式 <code class=\"docutils literal notranslate\">DATETIME_INPUT_FORMATS</code> 和 <code class=\"docutils literal notranslate\">DATE_INPUT_FORMATS</code> 键中获取。也请参见 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/i18n/formatting/\"><span class=\"doc\">格式本地化</span></a>。</p>\n<aside class=\"version-note version-changed\" data-version=\"3.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>增加了对 ISO 8601 日期字符串解析的支持（包括可选的时区）。</p>\n<p>在默认的 <code class=\"docutils literal notranslate\">input_formats</code> 中增加了 <code class=\"docutils literal notranslate\">DATE_INPUT_FORMATS</code> 的后备功能。</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"decimalfield\">\n<h3><code class=\"docutils literal notranslate\">DecimalField</code><a class=\"heading-anchor\" href=\"#decimalfield\"><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.DecimalField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">DecimalField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.DecimalField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>当 <a class=\"reference internal\" href=\"#django.forms.Field.localize\" title=\"django.forms.Field.localize\"><code class=\"xref py py-attr docutils literal notranslate\">Field.localize</code></a> 为 <code class=\"docutils literal notranslate\">False</code> 时是 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.NumberInput\" title=\"django.forms.NumberInput\"><code class=\"xref py py-class docutils literal notranslate\">NumberInput</code></a> 否则，该字段的默认表单部件是 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a>。</p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：Python 的 <code class=\"docutils literal notranslate\">decimal</code>。</p></li>\n<li><p>验证给定值是否为十进制。如果提供了 <code class=\"docutils literal notranslate\">max_value</code> 和 <code class=\"docutils literal notranslate\">min_value</code>，则使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.MaxValueValidator\" title=\"django.core.validators.MaxValueValidator\"><code class=\"xref py py-class docutils literal notranslate\">MaxValueValidator</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.MinValueValidator\" title=\"django.core.validators.MinValueValidator\"><code class=\"xref py py-class docutils literal notranslate\">MinValueValidator</code></a>。前面和后面的空格会被忽略。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code>、<code class=\"docutils literal notranslate\">max_value</code>、<code class=\"docutils literal notranslate\">min_value</code>、<code class=\"docutils literal notranslate\">max_digits</code>、<code class=\"docutils literal notranslate\">max_decimal_places</code>、<code class=\"docutils literal notranslate\">max_whole_digits</code></p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\">max_value</code> 和 <code class=\"docutils literal notranslate\">min_value</code> 错误信息可能包含 <code class=\"docutils literal notranslate\">%(limit_value)s</code>，将用适当的限制代替。同样，<code class=\"docutils literal notranslate\">max_digits</code>、<code class=\"docutils literal notranslate\">max_decimal_places</code> 和 <code class=\"docutils literal notranslate\">max_whole_digits</code> 错误信息可能包含 <code class=\"docutils literal notranslate\">%(max)s</code>。</p>\n<p>需要四个可选的参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.DecimalField.max_value\">\n<span class=\"sig-name descname\">max_value</span><a class=\"heading-anchor\" href=\"#django.forms.DecimalField.max_value\"><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.DecimalField.min_value\">\n<span class=\"sig-name descname\">min_value</span><a class=\"heading-anchor\" href=\"#django.forms.DecimalField.min_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\">decimal.Decimal</code> 值的形式给出。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.DecimalField.max_digits\">\n<span class=\"sig-name descname\">max_digits</span><a class=\"heading-anchor\" href=\"#django.forms.DecimalField.max_digits\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>值中允许的最大数字（小数点前的数字加上小数点后的数字，去掉前导零）。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.DecimalField.decimal_places\">\n<span class=\"sig-name descname\">decimal_places</span><a class=\"heading-anchor\" href=\"#django.forms.DecimalField.decimal_places\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>允许的最大小数位数。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"durationfield\">\n<h3><code class=\"docutils literal notranslate\">DurationField</code><a class=\"heading-anchor\" href=\"#durationfield\"><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.DurationField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">DurationField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.DurationField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：Python 的 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.timedelta\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">timedelta</code></a>。</p></li>\n<li><p>验证给定值是否是一个字符串，可以转换成 <code class=\"docutils literal notranslate\">timedelta</code>。该值必须在 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.timedelta.min\" title=\"(in Python v3.14)\"><code class=\"xref py py-attr docutils literal notranslate\">datetime.timedelta.min</code></a> 和 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.timedelta.max\" title=\"(in Python v3.14)\"><code class=\"xref py py-attr docutils literal notranslate\">datetime.timedelta.max</code></a> 之间。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code>、<code class=\"docutils literal notranslate\">overflow</code></p></li>\n</ul>\n<p>接受 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/utils/#django.utils.dateparse.parse_duration\" title=\"django.utils.dateparse.parse_duration\"><code class=\"xref py py-func docutils literal notranslate\">parse_duration()</code></a> 理解的任何格式。</p>\n</dd></dl>\n\n</section>\n<section id=\"emailfield\">\n<h3><code class=\"docutils literal notranslate\">EmailField</code><a class=\"heading-anchor\" href=\"#emailfield\"><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.EmailField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">EmailField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.EmailField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.EmailInput\" title=\"django.forms.EmailInput\"><code class=\"xref py py-class docutils literal notranslate\">EmailInput</code></a></p></li>\n<li><p>空值：不管你给 <code class=\"xref py py-attr docutils literal notranslate\">empty_value</code> 的是什么。</p></li>\n<li><p>规范化为：一个字符串。</p></li>\n<li><p>使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.EmailValidator\" title=\"django.core.validators.EmailValidator\"><code class=\"xref py py-class docutils literal notranslate\">EmailValidator</code></a> 来验证给定的值是一个有效的电子邮件地址，使用一个适度复杂的正则表达式。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code></p></li>\n</ul>\n<p>Has three optional arguments <code class=\"docutils literal notranslate\">max_length</code>, <code class=\"docutils literal notranslate\">min_length</code>, and\n<code class=\"docutils literal notranslate\">empty_value</code> which work just as they do for <a class=\"reference internal\" href=\"#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a>. The\n<code class=\"docutils literal notranslate\">max_length</code> argument defaults to 320 (see <span class=\"target\" id=\"index-0\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc3696.html#section-3\"><strong>RFC 3696 Section 3</strong></a>).</p>\n<aside class=\"version-note version-changed\" data-version=\"3.2.20\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 3.2.20</p><p>The default value for <code class=\"docutils literal notranslate\">max_length</code> was changed to 320 characters.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"filefield\">\n<h3><code class=\"docutils literal notranslate\">FileField</code><a class=\"heading-anchor\" href=\"#filefield\"><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.FileField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">FileField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.FileField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.ClearableFileInput\" title=\"django.forms.ClearableFileInput\"><code class=\"xref py py-class docutils literal notranslate\">ClearableFileInput</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：一个 <code class=\"docutils literal notranslate\">UploadedFile</code> 对象，它将文件内容和文件名包装成一个单一对象。</p></li>\n<li><p>可以验证非空文件数据已经绑定到表单中。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code>、<code class=\"docutils literal notranslate\">missing</code>、<code class=\"docutils literal notranslate\">empty</code>、<code class=\"docutils literal notranslate\">max_length</code></p></li>\n</ul>\n<p>有两个可选的验证参数，<code class=\"docutils literal notranslate\">max_length</code> 和 <code class=\"docutils literal notranslate\">allow_empty_file</code>。如果提供了这两个参数，将确保文件名的长度最多为给定长度，即使文件内容为空，验证也会成功。</p>\n<p>要了解更多关于 <code class=\"docutils literal notranslate\">UploadedFile</code> 对象的信息，请看 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/http/file-uploads/\"><span class=\"doc\">文件上传文档</span></a>。</p>\n<p>当你在表单中使用 <code class=\"docutils literal notranslate\">FileField</code> 时，你还必须记住 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/api/#binding-uploaded-files\"><span class=\"std std-ref\">将文件数据绑定到表单中</span></a>。</p>\n<p><code class=\"docutils literal notranslate\">max_length</code> 错误指的是文件名的长度。在该键的错误信息中，<code class=\"docutils literal notranslate\">%(max)d</code> 将被替换为最大文件名长度，<code class=\"docutils literal notranslate\">%(length)d</code> 将被替换为当前文件名长度。</p>\n</dd></dl>\n\n</section>\n<section id=\"filepathfield\">\n<h3><code class=\"docutils literal notranslate\">FilePathField</code><a class=\"heading-anchor\" href=\"#filepathfield\"><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.FilePathField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">FilePathField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.FilePathField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.Select\" title=\"django.forms.Select\"><code class=\"xref py py-class docutils literal notranslate\">Select</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">''</code> （空字符串）</p></li>\n<li><p>规范化为：一个字符串。</p></li>\n<li><p>验证选择是否存在于选择列表中。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid_choice</code></p></li>\n</ul>\n<p>该字段允许从某个目录内的文件中选择。它需要五个额外的参数；只有 <code class=\"docutils literal notranslate\">path</code> 是必须的。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.FilePathField.path\">\n<span class=\"sig-name descname\">path</span><a class=\"heading-anchor\" href=\"#django.forms.FilePathField.path\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>你想要列出的内容的目录的绝对路径。该目录必须存在。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.FilePathField.recursive\">\n<span class=\"sig-name descname\">recursive</span><a class=\"heading-anchor\" href=\"#django.forms.FilePathField.recursive\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果 <code class=\"docutils literal notranslate\">False</code> （默认），只提供 <code class=\"docutils literal notranslate\">path</code> 的直接内容作为选择。如果 <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.FilePathField.match\">\n<span class=\"sig-name descname\">match</span><a class=\"heading-anchor\" href=\"#django.forms.FilePathField.match\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>正则表达式模式；只允许将名称与此表达式相匹配的文件作为选择。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.FilePathField.allow_files\">\n<span class=\"sig-name descname\">allow_files</span><a class=\"heading-anchor\" href=\"#django.forms.FilePathField.allow_files\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>可选。 可选 <code class=\"docutils literal notranslate\">True</code> 或 <code class=\"docutils literal notranslate\">False</code>。 默认值是 <code class=\"docutils literal notranslate\">True</code>。 指定是否应该包含指定位置的文件。 此项或 <a class=\"reference internal\" href=\"#django.forms.FilePathField.allow_folders\" title=\"django.forms.FilePathField.allow_folders\"><code class=\"xref py py-attr docutils literal notranslate\">allow_folders</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.FilePathField.allow_folders\">\n<span class=\"sig-name descname\">allow_folders</span><a class=\"heading-anchor\" href=\"#django.forms.FilePathField.allow_folders\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>可选。 可选 <code class=\"docutils literal notranslate\">True</code> 或 <code class=\"docutils literal notranslate\">False</code>。 默认为 <code class=\"docutils literal notranslate\">False</code>。 指定是否应包括指定位置的文件夹。 此项或 <a class=\"reference internal\" href=\"#django.forms.FilePathField.allow_files\" title=\"django.forms.FilePathField.allow_files\"><code class=\"xref py py-attr docutils literal notranslate\">allow_files</code></a> 必须为 <code class=\"docutils literal notranslate\">True</code>。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"floatfield\">\n<h3><code class=\"docutils literal notranslate\">FloatField</code><a class=\"heading-anchor\" href=\"#floatfield\"><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.FloatField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">FloatField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.FloatField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>当 <a class=\"reference internal\" href=\"#django.forms.Field.localize\" title=\"django.forms.Field.localize\"><code class=\"xref py py-attr docutils literal notranslate\">Field.localize</code></a> 为 <code class=\"docutils literal notranslate\">False</code> 时是 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.NumberInput\" title=\"django.forms.NumberInput\"><code class=\"xref py py-class docutils literal notranslate\">NumberInput</code></a> 否则，该字段的默认表单部件是 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a>。</p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：Python 的浮点数。</p></li>\n<li><p>验证给定的值是否为浮点数。如果提供了 <code class=\"docutils literal notranslate\">max_value</code> 和 <code class=\"docutils literal notranslate\">min_value</code>，则使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.MaxValueValidator\" title=\"django.core.validators.MaxValueValidator\"><code class=\"xref py py-class docutils literal notranslate\">MaxValueValidator</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.MinValueValidator\" title=\"django.core.validators.MinValueValidator\"><code class=\"xref py py-class docutils literal notranslate\">MinValueValidator</code></a>。允许使用前导空格和后导空格，就像 Python 的 <code class=\"docutils literal notranslate\">float()</code> 函数一样。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code>、<code class=\"docutils literal notranslate\">max_value</code>、<code class=\"docutils literal notranslate\">min_value</code></p></li>\n</ul>\n<p>取两个可选参数：<code class=\"docutils literal notranslate\">max_value</code> 和 <code class=\"docutils literal notranslate\">min_value</code>。这两个参数控制该字段允许的值的范围。</p>\n</dd></dl>\n\n</section>\n<section id=\"imagefield\">\n<h3><code class=\"docutils literal notranslate\">ImageField</code><a class=\"heading-anchor\" href=\"#imagefield\"><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.ImageField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ImageField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ImageField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.ClearableFileInput\" title=\"django.forms.ClearableFileInput\"><code class=\"xref py py-class docutils literal notranslate\">ClearableFileInput</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：一个 <code class=\"docutils literal notranslate\">UploadedFile</code> 对象，它将文件内容和文件名包装成一个单一对象。</p></li>\n<li><p>验证文件数据是否已经绑定到表单中。同时使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.FileExtensionValidator\" title=\"django.core.validators.FileExtensionValidator\"><code class=\"xref py py-class docutils literal notranslate\">FileExtensionValidator</code></a> 来验证 Pillow 是否支持文件扩展名。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code>、<code class=\"docutils literal notranslate\">missing</code>、<code class=\"docutils literal notranslate\">empty</code>、<code class=\"docutils literal notranslate\">invalid_image</code></p></li>\n</ul>\n<p>使用 <code class=\"docutils literal notranslate\">ImageField</code> 需要安装的 <a class=\"reference external\" href=\"https://pillow.readthedocs.io/en/latest/\">Pillow</a> 支持你使用的图片格式。如果你在上传图片时遇到 <code class=\"docutils literal notranslate\">corrupt image</code> 错误，通常意味着 Pillow 不理解图片格式。要解决这个问题，请安装相应的库并重新安装 Pillow。</p>\n<p>当你在表单中使用 <code class=\"docutils literal notranslate\">ImageField</code> 时，你还必须记住 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/api/#binding-uploaded-files\"><span class=\"std std-ref\">将文件数据绑定到表单</span></a>。</p>\n<p>在字段被清理和验证后，<code class=\"docutils literal notranslate\">UploadedFile</code> 对象将有一个额外的 <code class=\"docutils literal notranslate\">image</code> 属性，包含用于检查文件是否为有效图像的 Pillow <a class=\"reference external\" href=\"https://pillow.readthedocs.io/en/latest/reference/Image.html\">Image</a> 实例。Pillow 在验证图像后关闭了底层文件描述符，所以虽然非图像数据属性如 <code class=\"docutils literal notranslate\">format</code>、<code class=\"docutils literal notranslate\">height</code> 和 <code class=\"docutils literal notranslate\">width</code> 可用，但访问底层图像数据的方法，如 <code class=\"docutils literal notranslate\">getdata()</code> 或 <code class=\"docutils literal notranslate\">getpixel()</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\">PIL</span> <span class=\"kn\">import</span> Image\n<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=\"kn\">from</span> <span class=\"nn\">django.core.files.uploadedfile</span> <span class=\"kn\">import</span> SimpleUploadedFile\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">ImageForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    img <span class=\"o\">=</span> forms<span class=\"o\">.</span>ImageField<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>file_data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;img&#39;</span><span class=\"p\">:</span> SimpleUploadedFile<span class=\"p\">(</span><span class=\"s1\">&#39;test.png&#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=\"gp\">&gt;&gt;&gt; </span>form <span class=\"o\">=</span> ImageForm<span class=\"p\">({},</span> file_data<span class=\"p\">)</span>\n<span class=\"go\"># Pillow closes the underlying file descriptor.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>form<span class=\"o\">.</span>is_valid<span class=\"p\">()</span>\n<span class=\"go\">True</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>image_field <span class=\"o\">=</span> form<span class=\"o\">.</span>cleaned_data<span class=\"p\">[</span><span class=\"s1\">&#39;img&#39;</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>image_field<span class=\"o\">.</span>image\n<span class=\"go\">&lt;PIL.PngImagePlugin.PngImageFile image mode=RGBA size=191x287 at 0x7F5985045C18&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>image_field<span class=\"o\">.</span>image<span class=\"o\">.</span>width\n<span class=\"go\">191</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>image_field<span class=\"o\">.</span>image<span class=\"o\">.</span>height\n<span class=\"go\">287</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>image_field<span class=\"o\">.</span>image<span class=\"o\">.</span>format\n<span class=\"go\">&#39;PNG&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>image_field<span class=\"o\">.</span>image<span class=\"o\">.</span>getdata<span class=\"p\">()</span>\n<span class=\"go\"># Raises AttributeError: &#39;NoneType&#39; object has no attribute &#39;seek&#39;.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>image <span class=\"o\">=</span> Image<span class=\"o\">.</span>open<span class=\"p\">(</span>image_field<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>image<span class=\"o\">.</span>getdata<span class=\"p\">()</span>\n<span class=\"go\">&lt;ImagingCore object at 0x7f5984f874b0&gt;</span>\n</code></pre></div>\n<p>此外，<code class=\"docutils literal notranslate\">UploadedFile.content_type</code> 如果 Pillow 能够确定图片的内容类型，则会以图片的内容类型进行更新，否则会设置为 <code class=\"docutils literal notranslate\">None</code>。</p>\n</dd></dl>\n\n</section>\n<section id=\"integerfield\">\n<h3><code class=\"docutils literal notranslate\">IntegerField</code><a class=\"heading-anchor\" href=\"#integerfield\"><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.IntegerField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">IntegerField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.IntegerField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>当 <a class=\"reference internal\" href=\"#django.forms.Field.localize\" title=\"django.forms.Field.localize\"><code class=\"xref py py-attr docutils literal notranslate\">Field.localize</code></a> 为 <code class=\"docutils literal notranslate\">False</code> 时是 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.NumberInput\" title=\"django.forms.NumberInput\"><code class=\"xref py py-class docutils literal notranslate\">NumberInput</code></a> 否则，该字段的默认表单部件是 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a>。</p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：Python 的整数。</p></li>\n<li><p>验证给定值是否为整数。如果提供了 <code class=\"docutils literal notranslate\">max_value</code> 和 <code class=\"docutils literal notranslate\">min_value</code>，则使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.MaxValueValidator\" title=\"django.core.validators.MaxValueValidator\"><code class=\"xref py py-class docutils literal notranslate\">MaxValueValidator</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.MinValueValidator\" title=\"django.core.validators.MinValueValidator\"><code class=\"xref py py-class docutils literal notranslate\">MinValueValidator</code></a>。允许使用前导空格和后导空格，就像 Python 的 <code class=\"docutils literal notranslate\">int()</code> 函数一样。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code>、<code class=\"docutils literal notranslate\">max_value</code>、<code class=\"docutils literal notranslate\">min_value</code></p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\">max_value</code> 和 <code class=\"docutils literal notranslate\">min_value</code> 的错误信息可能包含 <code class=\"docutils literal notranslate\">%(limit_value)s</code>，将用适当的限制来代替。</p>\n<p>需要两个可选参数进行验证：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.IntegerField.max_value\">\n<span class=\"sig-name descname\">max_value</span><a class=\"heading-anchor\" href=\"#django.forms.IntegerField.max_value\"><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.IntegerField.min_value\">\n<span class=\"sig-name descname\">min_value</span><a class=\"heading-anchor\" href=\"#django.forms.IntegerField.min_value\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这些控制了该字段允许的数值范围。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"jsonfield\">\n<h3><code class=\"docutils literal notranslate\">JSONField</code><a class=\"heading-anchor\" href=\"#jsonfield\"><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.JSONField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">JSONField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">encoder<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">decoder<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.JSONField\"><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=\"3.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 3.1</p></aside>\n<p>一个接受 JSON 编码数据的字段 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a>。</p>\n<ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.Textarea\" title=\"django.forms.Textarea\"><code class=\"xref py py-class docutils literal notranslate\">Textarea</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：JSON 值的 Python 表示（通常为 <code class=\"docutils literal notranslate\">dict</code>、<code class=\"docutils literal notranslate\">list</code> 或 <code class=\"docutils literal notranslate\">None</code>），取决于 <a class=\"reference internal\" href=\"#django.forms.JSONField.decoder\" title=\"django.forms.JSONField.decoder\"><code class=\"xref py py-attr docutils literal notranslate\">JSONField.decoder</code></a>。</p></li>\n<li><p>验证给定值是否为有效的 JSON。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code></p></li>\n</ul>\n<p>需要两个可选的参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.JSONField.encoder\">\n<span class=\"sig-name descname\">encoder</span><a class=\"heading-anchor\" href=\"#django.forms.JSONField.encoder\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/json.html#json.JSONEncoder\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">json.JSONEncoder</code></a> 子类，用于序列化标准 JSON 序列器不支持的数据类型（例如 <code class=\"docutils literal notranslate\">datetime.datetime</code> 或 <a class=\"reference external\" href=\"https://docs.python.org/3/library/uuid.html#uuid.UUID\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">UUID</code></a>）。例如，你可以使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/serialization/#django.core.serializers.json.DjangoJSONEncoder\" title=\"django.core.serializers.json.DjangoJSONEncoder\"><code class=\"xref py py-class docutils literal notranslate\">DjangoJSONEncoder</code></a> 类。</p>\n<p>默认为 <code class=\"docutils literal notranslate\">json.JSONEncoder</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.JSONField.decoder\">\n<span class=\"sig-name descname\">decoder</span><a class=\"heading-anchor\" href=\"#django.forms.JSONField.decoder\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/json.html#json.JSONDecoder\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">json.JSONDecoder</code></a> 子类来反序列化输入。你的反序列化可能需要考虑到你无法确定输入类型的事实。例如，你有可能返回一个 <code class=\"docutils literal notranslate\">datetime</code>，但实际上是一个字符串，而这个字符串恰好与 <code class=\"docutils literal notranslate\">datetime</code> 的格式相同。</p>\n<p><code class=\"docutils literal notranslate\">decoder</code> 可用于验证输入。如果在反序列化过程中出现 <code class=\"xref py py-class docutils literal notranslate\">json.JSONONDecodeError</code>，则会出现 <code class=\"docutils literal notranslate\">ValidationError</code>。</p>\n<p>默认为 <code class=\"docutils literal notranslate\">json.JSONDecoder</code>。</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>如果你使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a>，将使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a> 中的 <code class=\"docutils literal notranslate\">encoder</code> 和 <code class=\"docutils literal notranslate\">decoder</code>。</p>\n</aside>\n<aside class=\"admonition-user-friendly-forms admonition\" role=\"note\">\n<p class=\"admonition-title\">用户友好的表单</p>\n<p><code class=\"docutils literal notranslate\">JSONField</code> 在大多数情况下不是特别方便用户使用。但是，它是一种有用的方式，可以将客户端部件的数据格式化，以便提交给服务器。</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"genericipaddressfield\">\n<h3><code class=\"docutils literal notranslate\">GenericIPAddressField</code><a class=\"heading-anchor\" href=\"#genericipaddressfield\"><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.GenericIPAddressField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">GenericIPAddressField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.GenericIPAddressField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个包含 IPv4 或 IPv6地址 的字段。</p>\n<ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">''</code> （空字符串）</p></li>\n<li><p>规范化为：一个字符串。IPv6 地址的规范化如下所述。</p></li>\n<li><p>验证给定的值是一个有效的 IP 地址。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code></p></li>\n</ul>\n<p>IPv6 地址规范化遵循 <span class=\"target\" id=\"index-3\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc4291.html#section-2.2\"><strong>RFC 4291 Section 2.2</strong></a> 第 2.2 节，包括使用该节第 3 段建议的 IPv4 格式，如 <code class=\"docutils literal notranslate\">::fffff:192.0.2.0</code>。例如，<code class=\"docutils literal notranslate\">2001:0::0:01</code> 将被标准化为 <code class=\"docutils literal notranslate\">2001::1</code>，<code class=\"docutils literal notranslate\">::fffff:0a0a:0a0a</code> 将被标准化为 <code class=\"docutils literal notranslate\">::fffff:10.10.10.10</code>。所有字符都转换为小写。</p>\n<p>需要两个可选的参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.GenericIPAddressField.protocol\">\n<span class=\"sig-name descname\">protocol</span><a class=\"heading-anchor\" href=\"#django.forms.GenericIPAddressField.protocol\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>将有效输入限制为指定协议。接受的值是 <code class=\"docutils literal notranslate\">both</code> （默认）、<code class=\"docutils literal notranslate\">IPv4</code> 或 <code class=\"docutils literal notranslate\">IPv6</code>。匹配是不区分大小写的。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.GenericIPAddressField.unpack_ipv4\">\n<span class=\"sig-name descname\">unpack_ipv4</span><a class=\"heading-anchor\" href=\"#django.forms.GenericIPAddressField.unpack_ipv4\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>解压 IPv4 映射地址，如 <code class=\"docutils literal notranslate\">::fffff:192.0.2.1</code>。如果启用该选项，该地址将被解压为 <code class=\"docutils literal notranslate\">192.0.2.1</code>。默认为禁用。只有当 <code class=\"docutils literal notranslate\">protocol</code> 设置为 <code class=\"docutils literal notranslate\">'both'</code> 时才会启用。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"multiplechoicefield\">\n<h3><code class=\"docutils literal notranslate\">MultipleChoiceField</code><a class=\"heading-anchor\" href=\"#multiplechoicefield\"><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.MultipleChoiceField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">MultipleChoiceField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.MultipleChoiceField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.SelectMultiple\" title=\"django.forms.SelectMultiple\"><code class=\"xref py py-class docutils literal notranslate\">SelectMultiple</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">[]</code> （空列表）</p></li>\n<li><p>规范化为：一个字符串列表。</p></li>\n<li><p>验证给定值列表中的每个值是否存在于选择列表中。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid_choice</code>、<code class=\"docutils literal notranslate\">invalid_list</code></p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\">invalid_choice</code> 错误信息可能包含 <code class=\"docutils literal notranslate\">%(value)s</code>，该信息将被替换为选定的选择。</p>\n<p>与 <a class=\"reference internal\" href=\"#django.forms.ChoiceField\" title=\"django.forms.ChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ChoiceField</code></a> 一样，多了一个必要参数 <code class=\"docutils literal notranslate\">choices</code>。</p>\n</dd></dl>\n\n</section>\n<section id=\"typedmultiplechoicefield\">\n<h3><code class=\"docutils literal notranslate\">TypedMultipleChoiceField</code><a class=\"heading-anchor\" href=\"#typedmultiplechoicefield\"><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.TypedMultipleChoiceField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">TypedMultipleChoiceField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.TypedMultipleChoiceField\"><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.MultipleChoiceField\" title=\"django.forms.MultipleChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">MultipleChoiceField</code></a> 一样，只是 <a class=\"reference internal\" href=\"#django.forms.TypedMultipleChoiceField\" title=\"django.forms.TypedMultipleChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">TypedMultipleChoiceField</code></a> 需要两个额外的参数：<code class=\"docutils literal notranslate\">coerce</code> 和 <code class=\"docutils literal notranslate\">empty_value</code>。</p>\n<ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.SelectMultiple\" title=\"django.forms.SelectMultiple\"><code class=\"xref py py-class docutils literal notranslate\">SelectMultiple</code></a></p></li>\n<li><p>空值：不管你给 <code class=\"xref py py-attr docutils literal notranslate\">empty_value</code> 的是什么。</p></li>\n<li><p>归法化为：<code class=\"docutils literal notranslate\">coerce</code> 参数提供的类型值列表。</p></li>\n<li><p>验证给定的值是否存在于选择列表中，并且可以被强制执行。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid_choice</code></p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\">invalid_choice</code> 错误信息可能包含 <code class=\"docutils literal notranslate\">%(value)s</code>，该信息将被替换为选定的选择。</p>\n<p>需要两个额外的参数，<code class=\"docutils literal notranslate\">coerce</code> 和 <code class=\"docutils literal notranslate\">empty_value</code>，如 <a class=\"reference internal\" href=\"#django.forms.TypedChoiceField\" title=\"django.forms.TypedChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">TypedChoiceField</code></a>。</p>\n</dd></dl>\n\n</section>\n<section id=\"nullbooleanfield\">\n<h3><code class=\"docutils literal notranslate\">NullBooleanField</code><a class=\"heading-anchor\" href=\"#nullbooleanfield\"><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.NullBooleanField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">NullBooleanField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.NullBooleanField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.NullBooleanSelect\" title=\"django.forms.NullBooleanSelect\"><code class=\"xref py py-class docutils literal notranslate\">NullBooleanSelect</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：Python 的 <code class=\"docutils literal notranslate\">True</code>、<code class=\"docutils literal notranslate\">False</code> 或 <code class=\"docutils literal notranslate\">None</code> 值。</p></li>\n<li><p>不验证任何东西（也就是说，它从不引起 <code class=\"docutils literal notranslate\">ValidationError</code>）。</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\">NullBooleanField</code> 可以通过提供部件 <code class=\"docutils literal notranslate\">choices</code> 来与诸如 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.Select\" title=\"django.forms.Select\"><code class=\"xref py py-class docutils literal notranslate\">Select</code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.RadioSelect\" title=\"django.forms.RadioSelect\"><code class=\"xref py py-class docutils literal notranslate\">RadioSelect</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>NullBooleanField<span class=\"p\">(</span>\n    widget<span class=\"o\">=</span>Select<span class=\"p\">(</span>\n        choices<span class=\"o\">=</span><span class=\"p\">[</span>\n            <span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Unknown&#39;</span><span class=\"p\">),</span>\n            <span class=\"p\">(</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Yes&#39;</span><span class=\"p\">),</span>\n            <span class=\"p\">(</span><span class=\"kc\">False</span><span class=\"p\">,</span> <span class=\"s1\">&#39;No&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">]</span>\n    <span class=\"p\">)</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"regexfield\">\n<h3><code class=\"docutils literal notranslate\">RegexField</code><a class=\"heading-anchor\" href=\"#regexfield\"><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.RegexField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">RegexField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.RegexField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a></p></li>\n<li><p>空值：不管你给 <code class=\"xref py py-attr docutils literal notranslate\">empty_value</code> 的是什么。</p></li>\n<li><p>规范化为：一个字符串。</p></li>\n<li><p>使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.RegexValidator\" title=\"django.core.validators.RegexValidator\"><code class=\"xref py py-class docutils literal notranslate\">RegexValidator</code></a> 来验证给定的值是否匹配某个正则表达式。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code></p></li>\n</ul>\n<p>需要一个额外的参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.RegexField.regex\">\n<span class=\"sig-name descname\">regex</span><a class=\"heading-anchor\" href=\"#django.forms.RegexField.regex\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个正则表达式，可以是字符串，也可以是编译后的正则表达式对象。</p>\n</dd></dl>\n\n<p>也接受 <code class=\"docutils literal notranslate\">max_length</code>、<code class=\"docutils literal notranslate\">min_length</code>、<code class=\"docutils literal notranslate\">strip</code> 和 <code class=\"docutils literal notranslate\">empty_value</code>，它们的工作原理和 <a class=\"reference internal\" href=\"#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> 一样。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.RegexField.strip\">\n<span class=\"sig-name descname\">strip</span><a class=\"heading-anchor\" href=\"#django.forms.RegexField.strip\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认值为 <code class=\"docutils literal notranslate\">False</code>。如果启用，将在验证正则表达式之前进行 strip。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"slugfield\">\n<h3><code class=\"docutils literal notranslate\">SlugField</code><a class=\"heading-anchor\" href=\"#slugfield\"><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.SlugField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">SlugField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.SlugField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a></p></li>\n<li><p>空值：不管你给 <a class=\"reference internal\" href=\"#django.forms.SlugField.empty_value\" title=\"django.forms.SlugField.empty_value\"><code class=\"xref py py-attr docutils literal notranslate\">empty_value</code></a> 的是什么。</p></li>\n<li><p>规范化为：一个字符串。</p></li>\n<li><p>使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.validate_slug\" title=\"django.core.validators.validate_slug\"><code class=\"xref py py-class docutils literal notranslate\">validate_slug</code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.validate_unicode_slug\" title=\"django.core.validators.validate_unicode_slug\"><code class=\"xref py py-class docutils literal notranslate\">validate_unicode_slug</code></a> 来验证给定值是否只包含字母、数字、下划线和连字符。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code></p></li>\n</ul>\n<p>这个字段用于在表单中表示一个模型 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/models/fields/#django.db.models.SlugField\" title=\"django.db.models.SlugField\"><code class=\"xref py py-class docutils literal notranslate\">SlugField</code></a>。</p>\n<p>需要两个可选的参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.SlugField.allow_unicode\">\n<span class=\"sig-name descname\">allow_unicode</span><a class=\"heading-anchor\" href=\"#django.forms.SlugField.allow_unicode\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个布尔值，指示该字段除了接受 ASCII 字母外，还接受 Unicode 字母。默认值为 <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.SlugField.empty_value\">\n<span class=\"sig-name descname\">empty_value</span><a class=\"heading-anchor\" href=\"#django.forms.SlugField.empty_value\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用来表示“空”的值。默认为空字符串。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"timefield\">\n<h3><code class=\"docutils literal notranslate\">TimeField</code><a class=\"heading-anchor\" href=\"#timefield\"><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.TimeField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">TimeField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.TimeField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.TimeInput\" title=\"django.forms.TimeInput\"><code class=\"xref py py-class docutils literal notranslate\">TimeInput</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：Python 的 <code class=\"docutils literal notranslate\">datetime.time</code> 对象。</p></li>\n<li><p>验证给定值是 <code class=\"docutils literal notranslate\">datetime.time</code> 或以特定时间格式化的字符串。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code></p></li>\n</ul>\n<p>需要一个可选的参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.TimeField.input_formats\">\n<span class=\"sig-name descname\">input_formats</span><a class=\"heading-anchor\" href=\"#django.forms.TimeField.input_formats\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用于将字符串转换为有效的 <code class=\"docutils literal notranslate\">datetime.time</code> 对象的格式列表。</p>\n</dd></dl>\n\n<p>如果没有提供 <code class=\"docutils literal notranslate\">input_formats</code> 参数，如果 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/settings/#std-setting-USE_L10N\"><code class=\"xref std std-setting docutils literal notranslate\">USE_L10N</code></a> 为 <code class=\"docutils literal notranslate\">False</code>，则默认输入格式来自 <code class=\"xref std std-setting docutils literal notranslate\">TIME_INPUT_FORMATS`</code>，如果启用了本地化，则来自激活的本地格式 <code class=\"docutils literal notranslate\">TIME_INPUT_FORMATS</code> 键。也请参见 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/i18n/formatting/\"><span class=\"doc\">格式本地化</span></a>。</p>\n</dd></dl>\n\n</section>\n<section id=\"urlfield\">\n<h3><code class=\"docutils literal notranslate\">URLField</code><a class=\"heading-anchor\" href=\"#urlfield\"><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.URLField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">URLField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.URLField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.URLInput\" title=\"django.forms.URLInput\"><code class=\"xref py py-class docutils literal notranslate\">URLInput</code></a></p></li>\n<li><p>空值：不管你给 <code class=\"xref py py-attr docutils literal notranslate\">empty_value</code> 的是什么。</p></li>\n<li><p>规范化为：一个字符串。</p></li>\n<li><p>使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/validators/#django.core.validators.URLValidator\" title=\"django.core.validators.URLValidator\"><code class=\"xref py py-class docutils literal notranslate\">URLValidator</code></a> 来验证给定值是一个有效的 URL。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code></p></li>\n</ul>\n<p>有三个可选参数 <code class=\"docutils literal notranslate\">max_length</code>、<code class=\"docutils literal notranslate\">min_length</code> 和 <code class=\"docutils literal notranslate\">empty_value</code>，它们的工作原理与 <a class=\"reference internal\" href=\"#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> 一样。</p>\n</dd></dl>\n\n</section>\n<section id=\"uuidfield\">\n<h3><code class=\"docutils literal notranslate\">UUIDField</code><a class=\"heading-anchor\" href=\"#uuidfield\"><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.UUIDField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">UUIDField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.UUIDField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：<a class=\"reference external\" href=\"https://docs.python.org/3/library/uuid.html#uuid.UUID\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">UUID</code></a> 对象。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code></p></li>\n</ul>\n<p>该字段将接受作为 <a class=\"reference external\" href=\"https://docs.python.org/3/library/uuid.html#uuid.UUID\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">UUID</code></a> 构造函数的 <code class=\"docutils literal notranslate\">hex</code> 参数的任何字符串格式。</p>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"slightly-complex-built-in-field-classes\">\n<h2>稍复杂的内置 <code class=\"docutils literal notranslate\">Field</code> 类<a class=\"heading-anchor\" href=\"#slightly-complex-built-in-field-classes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"combofield\">\n<h3><code class=\"docutils literal notranslate\">ComboField</code><a class=\"heading-anchor\" href=\"#combofield\"><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.ComboField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ComboField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ComboField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">''</code> （空字符串）</p></li>\n<li><p>规范化为：一个字符串。</p></li>\n<li><p>根据 <code class=\"docutils literal notranslate\">ComboField</code> 参数指定的每个字段验证给定值。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code></p></li>\n</ul>\n<p>需要一个额外的必要参数。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ComboField.fields\">\n<span class=\"sig-name descname\">fields</span><a class=\"heading-anchor\" href=\"#django.forms.ComboField.fields\"><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><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> ComboField\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ComboField<span class=\"p\">(</span>fields<span class=\"o\">=</span><span class=\"p\">[</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">),</span> EmailField<span class=\"p\">()])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"s1\">&#39;test@example.com&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;test@example.com&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>clean<span class=\"p\">(</span><span class=\"s1\">&#39;longemailaddress@example.com&#39;</span><span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">ValidationError</span>: [&#39;Ensure this value has at most 20 characters (it has 28).&#39;]\n</code></pre></div>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"multivaluefield\">\n<h3><code class=\"docutils literal notranslate\">MultiValueField</code><a class=\"heading-anchor\" href=\"#multivaluefield\"><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.MultiValueField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">MultiValueField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">fields<span class=\"o\">=</span><span class=\"default_value\">()</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.MultiValueField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">''</code> （空字符串）</p></li>\n<li><p>规范化为：子类的 <code class=\"docutils literal notranslate\">compress</code> 方法返回的类型。</p></li>\n<li><p>根据作为 <code class=\"docutils literal notranslate\">MultiValueField</code> 参数指定的每个字段验证给定值。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code>、<code class=\"docutils literal notranslate\">incomplete</code></p></li>\n</ul>\n<p>将多个字段的逻辑聚合在一起产生一个值。</p>\n<p>这个字段是抽象的，必须被子类化。与单值字段相反， <a class=\"reference internal\" href=\"#django.forms.MultiValueField\" title=\"django.forms.MultiValueField\"><code class=\"xref py py-class docutils literal notranslate\">MultiValueField</code></a> 的子类不能实现 <a class=\"reference internal\" href=\"#django.forms.Field.clean\" title=\"django.forms.Field.clean\"><code class=\"xref py py-meth docutils literal notranslate\">clean()</code></a>，而是——实现 <a class=\"reference internal\" href=\"#django.forms.MultiValueField.compress\" title=\"django.forms.MultiValueField.compress\"><code class=\"xref py py-meth docutils literal notranslate\">compress()</code></a>。</p>\n<p>需要一个额外的必要参数。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.MultiValueField.fields\">\n<span class=\"sig-name descname\">fields</span><a class=\"heading-anchor\" href=\"#django.forms.MultiValueField.fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>字段组成的元组，其值经清理后合并为一个值。 字段的每个值都由 <code class=\"docutils literal notranslate\">fields</code> 中的相应字段进行清理——第一个值由第一个字段清理，第二个值由第二个字段清理，等等。当所有字段清理完毕后，通过 <a class=\"reference internal\" href=\"#django.forms.MultiValueField.compress\" title=\"django.forms.MultiValueField.compress\"><code class=\"xref py py-meth docutils literal notranslate\">compress()</code></a> 将清理后的值列表合并为一个值。</p>\n</dd></dl>\n\n<p>还需要一些可选的参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.MultiValueField.require_all_fields\">\n<span class=\"sig-name descname\">require_all_fields</span><a class=\"heading-anchor\" href=\"#django.forms.MultiValueField.require_all_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认值为 <code class=\"docutils literal notranslate\">True</code>，在这种情况下，如果没有为任何字段提供值，就会出现 <code class=\"docutils literal notranslate\">required</code> 验证错误。</p>\n<p><a class=\"reference internal\" href=\"#django.forms.Field.required\" title=\"django.forms.Field.required\"><code class=\"xref py py-attr docutils literal notranslate\">Field.required</code></a> 属性设置为 <code class=\"docutils literal notranslate\">False</code> 时，可将单个字段设置为 <code class=\"docutils literal notranslate\">False</code>，使其成为可选字段。如果没有为必填字段提供任何值，就会出现 <code class=\"docutils literal notranslate\">incomplete</code> 的验证错误。</p>\n<p>可以在 <a class=\"reference internal\" href=\"#django.forms.MultiValueField\" title=\"django.forms.MultiValueField\"><code class=\"xref py py-class docutils literal notranslate\">MultiValueField</code></a> 子类上定义一个默认的 <code class=\"docutils literal notranslate\">incomplete</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.core.validators</span> <span class=\"kn\">import</span> RegexValidator\n\n<span class=\"k\">class</span> <span class=\"nc\">PhoneField</span><span class=\"p\">(</span>MultiValueField<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"c1\"># Define one message for all fields.</span>\n        error_messages <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;incomplete&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Enter a country calling code and a phone number.&#39;</span><span class=\"p\">,</span>\n        <span class=\"p\">}</span>\n        <span class=\"c1\"># Or define a different message for each field.</span>\n        fields <span class=\"o\">=</span> <span class=\"p\">(</span>\n            CharField<span class=\"p\">(</span>\n                error_messages<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;incomplete&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Enter a country calling code.&#39;</span><span class=\"p\">},</span>\n                validators<span class=\"o\">=</span><span class=\"p\">[</span>\n                    RegexValidator<span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^[0-9]+$&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Enter a valid country calling code.&#39;</span><span class=\"p\">),</span>\n                <span class=\"p\">],</span>\n            <span class=\"p\">),</span>\n            CharField<span class=\"p\">(</span>\n                error_messages<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;incomplete&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Enter a phone number.&#39;</span><span class=\"p\">},</span>\n                validators<span class=\"o\">=</span><span class=\"p\">[</span>RegexValidator<span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^[0-9]+$&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Enter a valid phone number.&#39;</span><span class=\"p\">)],</span>\n            <span class=\"p\">),</span>\n            CharField<span class=\"p\">(</span>\n                validators<span class=\"o\">=</span><span class=\"p\">[</span>RegexValidator<span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^[0-9]+$&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Enter a valid extension.&#39;</span><span class=\"p\">)],</span>\n                required<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n            <span class=\"p\">),</span>\n        <span class=\"p\">)</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span>\n            error_messages<span class=\"o\">=</span>error_messages<span class=\"p\">,</span> fields<span class=\"o\">=</span>fields<span class=\"p\">,</span>\n            require_all_fields<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> <span class=\"o\">**</span>kwargs\n        <span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.MultiValueField.widget\">\n<span class=\"sig-name descname\">widget</span><a class=\"heading-anchor\" href=\"#django.forms.MultiValueField.widget\"><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/3.2/ref/forms/widgets/#django.forms.MultiWidget\" title=\"django.forms.MultiWidget\"><code class=\"xref py py-class docutils literal notranslate\">django.forms.MultiWidget</code></a> 的子类。默认值是 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a>，在这种情况下可能不是很有用。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.MultiValueField.compress\">\n<span class=\"sig-name descname\">compress</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">data_list</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.MultiValueField.compress\"><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.SplitDateTimeField\" title=\"django.forms.SplitDateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">SplitDateTimeField</code></a> 是一个子类，它将一个时间字段和一个日期字段合并成一个 <code class=\"docutils literal notranslate\">datetime</code> 对象。</p>\n<p>这个方法必须在子类中实现。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"splitdatetimefield\">\n<h3><code class=\"docutils literal notranslate\">SplitDateTimeField</code><a class=\"heading-anchor\" href=\"#splitdatetimefield\"><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.SplitDateTimeField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">SplitDateTimeField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.SplitDateTimeField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.SplitDateTimeWidget\" title=\"django.forms.SplitDateTimeWidget\"><code class=\"xref py py-class docutils literal notranslate\">SplitDateTimeWidget</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：Python 的 <code class=\"docutils literal notranslate\">datetime.datetime</code> 对象。</p></li>\n<li><p>验证给定值是 <code class=\"docutils literal notranslate\">datetime.datetime</code> 或以特定日期时间格式化的字符串。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid</code>、<code class=\"docutils literal notranslate\">invalid_date</code>、<code class=\"docutils literal notranslate\">invalid_time</code></p></li>\n</ul>\n<p>需要两个可选的参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.SplitDateTimeField.input_date_formats\">\n<span class=\"sig-name descname\">input_date_formats</span><a class=\"heading-anchor\" href=\"#django.forms.SplitDateTimeField.input_date_formats\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用于将字符串转换为有效的 <code class=\"docutils literal notranslate\">datetime.date</code> 对象的格式列表。</p>\n</dd></dl>\n\n<p>如果没有提供 <code class=\"docutils literal notranslate\">input_date_formats</code> 参数，则使用 <a class=\"reference internal\" href=\"#django.forms.DateField\" title=\"django.forms.DateField\"><code class=\"xref py py-class docutils literal notranslate\">DateField</code></a> 的默认输入格式。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.SplitDateTimeField.input_time_formats\">\n<span class=\"sig-name descname\">input_time_formats</span><a class=\"heading-anchor\" href=\"#django.forms.SplitDateTimeField.input_time_formats\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用于将字符串转换为有效的 <code class=\"docutils literal notranslate\">datetime.time</code> 对象的格式列表。</p>\n</dd></dl>\n\n<p>如果没有提供 <code class=\"docutils literal notranslate\">input_time_formats</code> 参数，则使用 <a class=\"reference internal\" href=\"#django.forms.TimeField\" title=\"django.forms.TimeField\"><code class=\"xref py py-class docutils literal notranslate\">TimeField</code></a> 的默认输入格式。</p>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"fields-which-handle-relationships\">\n<span id=\"id2\"></span><h2>处理关系的字段<a class=\"heading-anchor\" href=\"#fields-which-handle-relationships\"><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.ModelChoiceField\" title=\"django.forms.ModelChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ModelChoiceField</code></a> 和 <a class=\"reference internal\" href=\"#django.forms.ModelMultipleChoiceField\" title=\"django.forms.ModelMultipleChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ModelMultipleChoiceField</code></a>。 这两个字段都需要一个 <code class=\"docutils literal notranslate\">queryset</code> 参数，用于创建字段的选择。 在表单验证后，这些字段将把一个模型对象（对于 <code class=\"docutils literal notranslate\">ModelChoiceField</code>）或多个模型对象（对于 <code class=\"docutils literal notranslate\">ModelMultipleChoiceField</code>）放入表单的 <code class=\"docutils literal notranslate\">cleaned_data</code> 字典中。</p>\n<p>对于更复杂的用途，你可以在声明表单字段时指定 <code class=\"docutils literal notranslate\">queryset=None</code>，然后在表单的 <code class=\"docutils literal notranslate\">__init__()</code> 方法中填充 <code class=\"docutils literal notranslate\">queryset</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\">FooMultipleChoiceForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    foo_select <span class=\"o\">=</span> forms<span class=\"o\">.</span>ModelMultipleChoiceField<span class=\"p\">(</span>queryset<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>fields<span class=\"p\">[</span><span class=\"s1\">&#39;foo_select&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>queryset <span class=\"o\">=</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">ModelChoiceField</code> 和 <code class=\"docutils literal notranslate\">ModelMultipleChoiceField</code> 都有一个 <code class=\"docutils literal notranslate\">iterator</code> 属性，它指定了在生成选择时用于迭代查询集的类。详见 <a class=\"reference internal\" href=\"#iterating-relationship-choices\"><span class=\"std std-ref\">迭代关系选择</span></a>。</p>\n<section id=\"modelchoicefield\">\n<h3><code class=\"docutils literal notranslate\">ModelChoiceField</code><a class=\"heading-anchor\" href=\"#modelchoicefield\"><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.ModelChoiceField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ModelChoiceField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ModelChoiceField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.Select\" title=\"django.forms.Select\"><code class=\"xref py py-class docutils literal notranslate\">Select</code></a></p></li>\n<li><p>空值：<code class=\"docutils literal notranslate\">None</code></p></li>\n<li><p>规范化为：一个模型实例。</p></li>\n<li><p>验证给定的 id 是否存在于查询集中。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid_choice</code></p></li>\n</ul>\n<p>允许选择一个单一的模型对象，适合代表一个外键。请注意，当条目数量增加时，<code class=\"docutils literal notranslate\">ModelChoiceField</code> 的默认部件变得不实用。你应该避免将其用于超过 100 个项目。</p>\n<p>需要一个参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelChoiceField.queryset\">\n<span class=\"sig-name descname\">queryset</span><a class=\"heading-anchor\" href=\"#django.forms.ModelChoiceField.queryset\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>由模型对象组成的 <code class=\"docutils literal notranslate\">QuerySet</code>，从中得出字段的选择，用于验证用户的选择。它在表单渲染时被执行。</p>\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\">ModelChoiceField</code> 也需要两个可选参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelChoiceField.empty_label\">\n<span class=\"sig-name descname\">empty_label</span><a class=\"heading-anchor\" href=\"#django.forms.ModelChoiceField.empty_label\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认情况下，<code class=\"docutils literal notranslate\">ModelChoiceField</code> 使用的 <code class=\"docutils literal notranslate\">&lt;select&gt;</code> 小组件将在列表顶部有一个空的选择。你可以用 <code class=\"docutils literal notranslate\">empty_label</code> 属性来改变这个标签的文本（默认是 <code class=\"docutils literal notranslate\">&quot;---------&quot;</code>），或者你可以通过将 <code class=\"docutils literal notranslate\">empty_label</code> 设置为 <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=\"c1\"># A custom empty label</span>\nfield1 <span class=\"o\">=</span> forms<span class=\"o\">.</span>ModelChoiceField<span class=\"p\">(</span>queryset<span class=\"o\">=...</span><span class=\"p\">,</span> empty_label<span class=\"o\">=</span><span class=\"s2\">&quot;(Nothing)&quot;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># No empty label</span>\nfield2 <span class=\"o\">=</span> forms<span class=\"o\">.</span>ModelChoiceField<span class=\"p\">(</span>queryset<span class=\"o\">=...</span><span class=\"p\">,</span> empty_label<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>请注意，如果 <code class=\"docutils literal notranslate\">ModelChoiceField</code> 是必需的，并且有一个默认的初始值，则不会创建空的选择（无论 <code class=\"docutils literal notranslate\">empty_label</code> 的值如何）。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelChoiceField.to_field_name\">\n<span class=\"sig-name descname\">to_field_name</span><a class=\"heading-anchor\" href=\"#django.forms.ModelChoiceField.to_field_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这个可选参数用于指定字段，作为字段的小组件中选择的值。请确保它是模型的唯一字段，否则所选的值可能会匹配多个对象。默认情况下，它被设置为 <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=\"c1\"># No custom to_field_name</span>\nfield1 <span class=\"o\">=</span> forms<span class=\"o\">.</span>ModelChoiceField<span class=\"p\">(</span>queryset<span class=\"o\">=...</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\">select</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;id_field1&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;field1&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">option</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;obj1.pk&quot;</span><span class=\"p\">&gt;</span>Object1<span class=\"p\">&lt;/</span><span class=\"nt\">option</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">option</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;obj2.pk&quot;</span><span class=\"p\">&gt;</span>Object2<span class=\"p\">&lt;/</span><span class=\"nt\">option</span><span class=\"p\">&gt;</span>\n...\n<span class=\"p\">&lt;/</span><span class=\"nt\">select</span><span class=\"p\">&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=\"c1\"># to_field_name provided</span>\nfield2 <span class=\"o\">=</span> forms<span class=\"o\">.</span>ModelChoiceField<span class=\"p\">(</span>queryset<span class=\"o\">=...</span><span class=\"p\">,</span> to_field_name<span class=\"o\">=</span><span class=\"s2\">&quot;name&quot;</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\">select</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;id_field2&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;field2&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">option</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;obj1.name&quot;</span><span class=\"p\">&gt;</span>Object1<span class=\"p\">&lt;/</span><span class=\"nt\">option</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">option</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;obj2.name&quot;</span><span class=\"p\">&gt;</span>Object2<span class=\"p\">&lt;/</span><span class=\"nt\">option</span><span class=\"p\">&gt;</span>\n...\n<span class=\"p\">&lt;/</span><span class=\"nt\">select</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\">ModelChoiceField</code> 也有属性：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelChoiceField.iterator\">\n<span class=\"sig-name descname\">iterator</span><a class=\"heading-anchor\" href=\"#django.forms.ModelChoiceField.iterator\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用于从 <code class=\"docutils literal notranslate\">queryset</code> 中生成字段选择的迭代器类。默认情况下， <a class=\"reference internal\" href=\"#django.forms.ModelChoiceIterator\" title=\"django.forms.ModelChoiceIterator\"><code class=\"xref py py-class docutils literal notranslate\">ModelChoiceIterator</code></a>。</p>\n</dd></dl>\n\n<p>模型的 <code class=\"docutils literal notranslate\">__str__()</code> 方法将被调用，以生成用于字段选择的对象的字符串表示。要提供自定义的表示，请将 <code class=\"docutils literal notranslate\">ModelChoiceField</code> 子类化，并覆盖 <code class=\"docutils literal notranslate\">label_from_instance</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.forms</span> <span class=\"kn\">import</span> ModelChoiceField\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModelChoiceField</span><span class=\"p\">(</span>ModelChoiceField<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">label_from_instance</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;My Object #</span><span class=\"si\">%i</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> obj<span class=\"o\">.</span>id\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"modelmultiplechoicefield\">\n<h3><code class=\"docutils literal notranslate\">ModelMultipleChoiceField</code><a class=\"heading-anchor\" href=\"#modelmultiplechoicefield\"><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.ModelMultipleChoiceField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ModelMultipleChoiceField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ModelMultipleChoiceField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><ul class=\"simple\">\n<li><p>默认部件：<a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.SelectMultiple\" title=\"django.forms.SelectMultiple\"><code class=\"xref py py-class docutils literal notranslate\">SelectMultiple</code></a></p></li>\n<li><p>空值：一个空的 <code class=\"docutils literal notranslate\">QuerySet</code> （<code class=\"docutils literal notranslate\">self.queryset.none()</code>）。</p></li>\n<li><p>规范化为：一个模型实例的 <code class=\"docutils literal notranslate\">QuerySet</code>。</p></li>\n<li><p>验证给定值列表中的每个 id 是否存在于查询集中。</p></li>\n<li><p>错误信息键：<code class=\"docutils literal notranslate\">required</code>、<code class=\"docutils literal notranslate\">invalid_list</code>、<code class=\"docutils literal notranslate\">invalid_choice</code>、<code class=\"docutils literal notranslate\">invalid_pk_value</code></p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\">invalid_choice</code> 信息可能包含 <code class=\"docutils literal notranslate\">%(value)s</code>，<code class=\"docutils literal notranslate\">invalid_pk_value</code> 信息可能包含 <code class=\"docutils literal notranslate\">%(pk)s</code>，将用适当的值代替。</p>\n<p>允许选择一个或多个模型对象，适合表示多对多关系。与 <a class=\"reference internal\" href=\"#django.forms.ModelChoiceField\" title=\"django.forms.ModelChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ModelChoiceField</code></a> 一样，你可以使用 <code class=\"docutils literal notranslate\">label_from_instance</code> 来自定义对象的表示。</p>\n<p>需要一个参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelMultipleChoiceField.queryset\">\n<span class=\"sig-name descname\">queryset</span><a class=\"heading-anchor\" href=\"#django.forms.ModelMultipleChoiceField.queryset\"><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.ModelChoiceField.queryset\" title=\"django.forms.ModelChoiceField.queryset\"><code class=\"xref py py-class docutils literal notranslate\">ModelChoiceField.queryset</code></a> 相同。</p>\n</dd></dl>\n\n<p>需要一个可选的参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelMultipleChoiceField.to_field_name\">\n<span class=\"sig-name descname\">to_field_name</span><a class=\"heading-anchor\" href=\"#django.forms.ModelMultipleChoiceField.to_field_name\"><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.ModelChoiceField.to_field_name\" title=\"django.forms.ModelChoiceField.to_field_name\"><code class=\"xref py py-class docutils literal notranslate\">ModelChoiceField.to_field_name</code></a> 相同。</p>\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\">ModelMultipleChoiceField</code> 也有属性：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelMultipleChoiceField.iterator\">\n<span class=\"sig-name descname\">iterator</span><a class=\"heading-anchor\" href=\"#django.forms.ModelMultipleChoiceField.iterator\"><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.ModelChoiceField.iterator\" title=\"django.forms.ModelChoiceField.iterator\"><code class=\"xref py py-class docutils literal notranslate\">ModelChoiceField.iterator</code></a> 相同。</p>\n</dd></dl>\n\n</dd></dl>\n\n<aside class=\"version-note version-deprecated\" data-version=\"3.1\" role=\"note\">\n<p class=\"version-note-title\">Deprecated since Django 3.1</p><p><span class=\"versionmodified deprecated\">Deprecated since version 3.1: </span><code class=\"docutils literal notranslate\">list</code> 消息已不适用，请使用 <code class=\"docutils literal notranslate\">invalid_list</code> 代替。</p>\n</aside>\n</section>\n<section id=\"iterating-relationship-choices\">\n<span id=\"id3\"></span><h3>迭代关系选择<a class=\"heading-anchor\" href=\"#iterating-relationship-choices\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>默认情况下， <a class=\"reference internal\" href=\"#django.forms.ModelChoiceField\" title=\"django.forms.ModelChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ModelChoiceField</code></a> 和 <a class=\"reference internal\" href=\"#django.forms.ModelMultipleChoiceField\" title=\"django.forms.ModelMultipleChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ModelMultipleChoiceField</code></a> 使用 <a class=\"reference internal\" href=\"#django.forms.ModelChoiceIterator\" title=\"django.forms.ModelChoiceIterator\"><code class=\"xref py py-class docutils literal notranslate\">ModelChoiceIterator</code></a> 来生成它们的字段 <code class=\"docutils literal notranslate\">choices</code>。</p>\n<p>When iterated, <code class=\"docutils literal notranslate\">ModelChoiceIterator</code> yields 2-tuple choices containing\n<a class=\"reference internal\" href=\"#django.forms.ModelChoiceIteratorValue\" title=\"django.forms.ModelChoiceIteratorValue\"><code class=\"xref py py-class docutils literal notranslate\">ModelChoiceIteratorValue</code></a> instances as the first <code class=\"docutils literal notranslate\">value</code> element in\neach choice. <code class=\"docutils literal notranslate\">ModelChoiceIteratorValue</code> wraps the choice value while\nmaintaining a reference to the source model instance that can be used in custom\nwidget implementations, for example, to add <a class=\"reference external\" href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-*\">data-* attributes</a> to\n<code class=\"docutils literal notranslate\">&lt;option&gt;</code> elements.</p>\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=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Topping</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    price <span class=\"o\">=</span> models<span class=\"o\">.</span>DecimalField<span class=\"p\">(</span>decimal_places<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">,</span> max_digits<span class=\"o\">=</span><span class=\"mi\">6</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>name\n\n<span class=\"k\">class</span> <span class=\"nc\">Pizza</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    topping <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Topping<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n</code></pre></div>\n<p>你可以使用 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/widgets/#django.forms.Select\" title=\"django.forms.Select\"><code class=\"xref py py-class docutils literal notranslate\">Select</code></a> 部件子类将 <code class=\"docutils literal notranslate\">Topping.price</code> 的值作为 HTML 属性 <code class=\"docutils literal notranslate\">data-price</code>，包含在每个 <code class=\"docutils literal notranslate\">&lt;option&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=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n<span class=\"k\">class</span> <span class=\"nc\">ToppingSelect</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Select<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">create_option</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> name<span class=\"p\">,</span> value<span class=\"p\">,</span> label<span class=\"p\">,</span> selected<span class=\"p\">,</span> index<span class=\"p\">,</span> subindex<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> attrs<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        option <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>create_option<span class=\"p\">(</span>name<span class=\"p\">,</span> value<span class=\"p\">,</span> label<span class=\"p\">,</span> selected<span class=\"p\">,</span> index<span class=\"p\">,</span> subindex<span class=\"p\">,</span> attrs<span class=\"p\">)</span>\n        <span class=\"k\">if</span> value<span class=\"p\">:</span>\n            option<span class=\"p\">[</span><span class=\"s1\">&#39;attrs&#39;</span><span class=\"p\">][</span><span class=\"s1\">&#39;data-price&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> value<span class=\"o\">.</span>instance<span class=\"o\">.</span>price\n        <span class=\"k\">return</span> option\n\n<span class=\"k\">class</span> <span class=\"nc\">PizzaForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Pizza\n        fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;topping&#39;</span><span class=\"p\">]</span>\n        widgets <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;topping&#39;</span><span class=\"p\">:</span> ToppingSelect<span class=\"p\">}</span>\n</code></pre></div>\n<p>这将使 <code class=\"docutils literal notranslate\">Pizza.topping</code> 选择为：</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\">select</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;id_topping&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;topping&quot;</span> <span class=\"na\">required</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">option</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;&quot;</span> <span class=\"na\">selected</span><span class=\"p\">&gt;</span>---------<span class=\"p\">&lt;/</span><span class=\"nt\">option</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">option</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;1&quot;</span> <span class=\"na\">data-price</span><span class=\"o\">=</span><span class=\"s\">&quot;1.50&quot;</span><span class=\"p\">&gt;</span>mushrooms<span class=\"p\">&lt;/</span><span class=\"nt\">option</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">option</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;2&quot;</span> <span class=\"na\">data-price</span><span class=\"o\">=</span><span class=\"s\">&quot;1.25&quot;</span><span class=\"p\">&gt;</span>onions<span class=\"p\">&lt;/</span><span class=\"nt\">option</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">option</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;3&quot;</span> <span class=\"na\">data-price</span><span class=\"o\">=</span><span class=\"s\">&quot;1.75&quot;</span><span class=\"p\">&gt;</span>peppers<span class=\"p\">&lt;/</span><span class=\"nt\">option</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">option</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;4&quot;</span> <span class=\"na\">data-price</span><span class=\"o\">=</span><span class=\"s\">&quot;2.00&quot;</span><span class=\"p\">&gt;</span>pineapple<span class=\"p\">&lt;/</span><span class=\"nt\">option</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">select</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>对于更高级的用法，你可以将 <code class=\"docutils literal notranslate\">ModelChoiceIterator</code> 子类化，以自定义产生的二元元组选择。</p>\n<section id=\"modelchoiceiterator\">\n<h4><code class=\"docutils literal notranslate\">ModelChoiceIterator</code><a class=\"heading-anchor\" href=\"#modelchoiceiterator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelChoiceIterator\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ModelChoiceIterator</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">field</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ModelChoiceIterator\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>指定给 <code class=\"xref py py-class docutils literal notranslate\">ModelChoiceField`和:class:`ModelMultipleChoiceField</code> 的 <code class=\"docutils literal notranslate\">iterator</code> 属性的默认类。迭代器，从查询集中产生二元元组选择。</p>\n<p>需要一个参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelChoiceIterator.field\">\n<span class=\"sig-name descname\">field</span><a class=\"heading-anchor\" href=\"#django.forms.ModelChoiceIterator.field\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">ModelChoiceField</code> 或 <code class=\"docutils literal notranslate\">ModelMultipleChoiceField</code> 的实例来迭代和产生选择。</p>\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\">ModelChoiceIter</code> 有以下方法：</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelChoiceIterator.__iter__\">\n<span class=\"sig-name descname\">__iter__</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ModelChoiceIterator.__iter__\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>产生二元元组选择，格式为 <code class=\"xref py py-attr docutils literal notranslate\">ChoiceField.chips</code> 使用的 <code class=\"docutils literal notranslate\">(value, label)</code>。第一个 <code class=\"docutils literal notranslate\">value</code> 元素是一个 <a class=\"reference internal\" href=\"#django.forms.ModelChoiceIteratorValue\" title=\"django.forms.ModelChoiceIteratorValue\"><code class=\"xref py py-class docutils literal notranslate\">ModelChoiceIteratorValue</code></a> 实例。</p>\n<aside class=\"version-note version-changed\" data-version=\"3.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>在旧版本中，选择元组中的第一个 <code class=\"docutils literal notranslate\">value</code> 元素是 <code class=\"docutils literal notranslate\">field</code> 值本身，而不是 <code class=\"docutils literal notranslate\">ModelChoiceIteratorValue</code> 实例。在大多数情况下，这个代理是透明的，但如果你需要 <code class=\"docutils literal notranslate\">field</code> 值本身，请使用 <a class=\"reference internal\" href=\"#django.forms.ModelChoiceIteratorValue.value\" title=\"django.forms.ModelChoiceIteratorValue.value\"><code class=\"xref py py-attr docutils literal notranslate\">ModelChoiceIteratorValue.value</code></a> 属性代替。</p>\n</aside>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"modelchoiceiteratorvalue\">\n<h4><code class=\"docutils literal notranslate\">ModelChoiceIteratorValue</code><a class=\"heading-anchor\" href=\"#modelchoiceiteratorvalue\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelChoiceIteratorValue\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ModelChoiceIteratorValue</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">value</em>, <em class=\"sig-param\">instance</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ModelChoiceIteratorValue\"><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=\"3.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 3.1</p></aside>\n<p>需要两个参数：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelChoiceIteratorValue.value\">\n<span class=\"sig-name descname\">value</span><a class=\"heading-anchor\" href=\"#django.forms.ModelChoiceIteratorValue.value\"><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\">&lt;option&gt;</code> 元素的 <code class=\"docutils literal notranslate\">value</code> 属性。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelChoiceIteratorValue.instance\">\n<span class=\"sig-name descname\">instance</span><a class=\"heading-anchor\" href=\"#django.forms.ModelChoiceIteratorValue.instance\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>来自查询集的模型实例。该实例可以在自定义的 <code class=\"docutils literal notranslate\">ChoiceWidget.create_option()</code> 实现中被访问，以调整渲染的 HTML。</p>\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\">ModelChoiceIteratorValue</code> 有以下方法：</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelChoiceIteratorValue.__str__\">\n<span class=\"sig-name descname\">__str__</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.ModelChoiceIteratorValue.__str__\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回 <code class=\"docutils literal notranslate\">value</code> 作为一个字符串在 HTML 中显示。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n</section>\n</section>\n<section id=\"creating-custom-fields\">\n<h2>创建自定义字段<a class=\"heading-anchor\" href=\"#creating-custom-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>如果内置的 <code class=\"docutils literal notranslate\">Field</code> 类不能满足你的需求，你可以创建自定义的 <code class=\"docutils literal notranslate\">Field</code> 类。为此，创建一个 <code class=\"docutils literal notranslate\">django.forms.Field</code> 的子类。它唯一的要求是实现一个 <code class=\"docutils literal notranslate\">clean()</code> 方法，并且它的 <code class=\"docutils literal notranslate\">__init__()</code> 方法接受上面提到的核心参数 (<code class=\"docutils literal notranslate\">required</code>, <code class=\"docutils literal notranslate\">label</code>, <code class=\"docutils literal notranslate\">initial</code>, <code class=\"docutils literal notranslate\">widget</code>, <code class=\"docutils literal notranslate\">help_text</code>)。</p>\n<p>你也可以通过覆盖 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/forms/api/#django.forms.Field.get_bound_field\" title=\"django.forms.Field.get_bound_field\"><code class=\"xref py py-meth docutils literal notranslate\">get_bound_field()</code></a> 来自定义字段的访问方式。</p>\n</section>","rootId":"module-django.forms.fields","toc":[{"title":"核心字段参数","anchor":"core-field-arguments","children":[{"title":"required","anchor":"required","children":[]},{"title":"label","anchor":"label","children":[]},{"title":"label_suffix","anchor":"label-suffix","children":[]},{"title":"initial","anchor":"initial","children":[]},{"title":"widget","anchor":"widget","children":[]},{"title":"help_text","anchor":"help-text","children":[]},{"title":"error_messages","anchor":"error-messages","children":[]},{"title":"validators","anchor":"validators","children":[]},{"title":"localize","anchor":"localize","children":[]},{"title":"disabled","anchor":"disabled","children":[]}]},{"title":"检查字段数据是否有变化","anchor":"checking-if-the-field-data-has-changed","children":[{"title":"has_changed()","anchor":"has-changed","children":[]}]},{"title":"内置 Field 类","anchor":"built-in-field-classes","children":[{"title":"BooleanField","anchor":"booleanfield","children":[]},{"title":"CharField","anchor":"charfield","children":[]},{"title":"ChoiceField","anchor":"choicefield","children":[]},{"title":"TypedChoiceField","anchor":"typedchoicefield","children":[]},{"title":"DateField","anchor":"datefield","children":[]},{"title":"DateTimeField","anchor":"datetimefield","children":[]},{"title":"DecimalField","anchor":"decimalfield","children":[]},{"title":"DurationField","anchor":"durationfield","children":[]},{"title":"EmailField","anchor":"emailfield","children":[]},{"title":"FileField","anchor":"filefield","children":[]},{"title":"FilePathField","anchor":"filepathfield","children":[]},{"title":"FloatField","anchor":"floatfield","children":[]},{"title":"ImageField","anchor":"imagefield","children":[]},{"title":"IntegerField","anchor":"integerfield","children":[]},{"title":"JSONField","anchor":"jsonfield","children":[]},{"title":"GenericIPAddressField","anchor":"genericipaddressfield","children":[]},{"title":"MultipleChoiceField","anchor":"multiplechoicefield","children":[]},{"title":"TypedMultipleChoiceField","anchor":"typedmultiplechoicefield","children":[]},{"title":"NullBooleanField","anchor":"nullbooleanfield","children":[]},{"title":"RegexField","anchor":"regexfield","children":[]},{"title":"SlugField","anchor":"slugfield","children":[]},{"title":"TimeField","anchor":"timefield","children":[]},{"title":"URLField","anchor":"urlfield","children":[]},{"title":"UUIDField","anchor":"uuidfield","children":[]}]},{"title":"稍复杂的内置 Field 类","anchor":"slightly-complex-built-in-field-classes","children":[{"title":"ComboField","anchor":"combofield","children":[]},{"title":"MultiValueField","anchor":"multivaluefield","children":[]},{"title":"SplitDateTimeField","anchor":"splitdatetimefield","children":[]}]},{"title":"处理关系的字段","anchor":"fields-which-handle-relationships","children":[{"title":"ModelChoiceField","anchor":"modelchoicefield","children":[]},{"title":"ModelMultipleChoiceField","anchor":"modelmultiplechoicefield","children":[]},{"title":"迭代关系选择","anchor":"iterating-relationship-choices","children":[{"title":"ModelChoiceIterator","anchor":"modelchoiceiterator","children":[]},{"title":"ModelChoiceIteratorValue","anchor":"modelchoiceiteratorvalue","children":[]}]}]},{"title":"创建自定义字段","anchor":"creating-custom-fields","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/3.2/ref/"},{"docname":"ref/forms/index","title":"表单","url":"/zh-hans/3.2/ref/forms/"}],"prev":{"docname":"ref/forms/api","title":"表单 API","url":"/zh-hans/3.2/ref/forms/api/"},"next":{"docname":"ref/forms/models","title":"模型表单函数","url":"/zh-hans/3.2/ref/forms/models/"},"formats":{"html":"/zh-hans/3.2/ref/forms/fields/","markdown":"/zh-hans/3.2/ref/forms/fields.md","json":"/zh-hans/3.2/ref/forms/fields.json"},"source":"https://github.com/django/django/blob/stable/3.2.x/docs/ref/forms/fields.txt","official":"https://docs.djangoproject.com/zh-hans/3.2/ref/forms/fields/","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"]}