{"title":"フォームセット (Formset)","version":"6.0","locale":"ja","docname":"topics/forms/formsets","url":"/ja/6.0/topics/forms/formsets/","canonical":"https://djangodocs.dev/ja/6.0/topics/forms/formsets/","summary":"class BaseFormSet Link to this definition # フォームセットは、同じページで複数のフォームを扱うための抽象レイヤーです。データグリッドに例えるとわかりやすいでしょう。次のようなフォームがあるとしましょう: Python console Copy >>> from django…","html":"<h1>フォームセット (Formset)<a class=\"heading-anchor\" href=\"#formsets\"><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.formsets.BaseFormSet\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">BaseFormSet</span></span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>フォームセットは、同じページで複数のフォームを扱うための抽象レイヤーです。データグリッドに例えるとわかりやすいでしょう。次のようなフォームがあるとしましょう:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">()</span>\n<span class=\"gp\">... </span>    <span class=\"n\">pub_date</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n<span class=\"gp\">...</span>\n</code></pre></div>\n<p>ユーザーが一度に複数の記事を作成できるようにしたいと思うかもしれません。 <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleForm</span></code> からフォームセットを作るには、次のようにします:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>これで <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleFormSet</span></code> という名前のフォームセットクラスが作成されました。フォームセットをインスタンス化することで、フォームセット内のフォームをイテレートし、通常のフォームと同じように表示できます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"n\">formset</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-title&quot;&gt;Title:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-0-title&quot; id=&quot;id_form-0-title&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-pub_date&quot;&gt;Pub date:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-0-pub_date&quot; id=&quot;id_form-0-pub_date&quot;&gt;&lt;/div&gt;</span>\n</code></pre></div>\n<p>見てのとおり、空のフォームがひとつだけ表示されました。表示される空のフォームの数は <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> パラメータで制御できます。デフォルトでは、 <a class=\"reference internal\" href=\"/ja/6.0/ref/forms/formsets/#django.forms.formsets.formset_factory\" title=\"django.forms.formsets.formset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">formset_factory()</span></code></a> は空のフォームを1つ定義します。次の例では、フォームセットクラスを作成して空のフォームを2つ表示します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">extra</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Formsets can be iterated and indexed, accessing forms in the order they were\ncreated. You can reorder the forms by overriding the default\n<a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__iter__\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">iteration</span></code></a> and\n<a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__getitem__\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">indexing</span></code></a> behavior if needed.</p>\n<section id=\"using-initial-data-with-a-formset\">\n<span id=\"formsets-initial-data\"></span><h2>フォームセットで初期データを指定する<a class=\"heading-anchor\" href=\"#using-initial-data-with-a-formset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>初期データはフォームセットの使いやすさを左右します。上で示したように、追加フォームの数を定義できます。これは、フォームセットが初期データから生成するフォームに加え、追加で表示するフォームの数を指定することを意味します。例を見てみましょう:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">extra</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"p\">[</span>\n<span class=\"gp\">... </span>        <span class=\"p\">{</span>\n<span class=\"gp\">... </span>            <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Django is now open source&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>            <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">:</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">(),</span>\n<span class=\"gp\">... </span>        <span class=\"p\">}</span>\n<span class=\"gp\">... </span>    <span class=\"p\">]</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"n\">formset</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-title&quot;&gt;Title:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-0-title&quot; value=&quot;Django is now open source&quot; id=&quot;id_form-0-title&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-pub_date&quot;&gt;Pub date:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-0-pub_date&quot; value=&quot;2023-02-11&quot; id=&quot;id_form-0-pub_date&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-1-title&quot;&gt;Title:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-1-title&quot; id=&quot;id_form-1-title&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-1-pub_date&quot;&gt;Pub date:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-1-pub_date&quot; id=&quot;id_form-1-pub_date&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-2-title&quot;&gt;Title:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-2-title&quot; id=&quot;id_form-2-title&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-2-pub_date&quot;&gt;Pub date:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-2-pub_date&quot; id=&quot;id_form-2-pub_date&quot;&gt;&lt;/div&gt;</span>\n</code></pre></div>\n<p>上の例では、今度は 3 つのフォームが表示されました。初期データとして渡された 1 つと、2 つの追加フォームです。初期データとして、辞書のリストを渡していることにも注意してください。</p>\n<p>フォームセットを描画するために <code class=\"docutils literal notranslate\"><span class=\"pre\">initial</span></code> を使う場合、フォームセットの送信を処理するときに同じ <code class=\"docutils literal notranslate\"><span class=\"pre\">initial</span></code> を渡して、どのフォームがユーザによって変更されたかをフォームセットが検出できるようにしてください。例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleFormSet(request.POST,</span> <span class=\"pre\">initial=[...])</span></code> のようになるでしょう。</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">参考</p>\n<p><a class=\"reference internal\" href=\"/ja/6.0/topics/forms/modelforms/#model-formsets\"><span class=\"std std-ref\">モデルフォームセットを使ってモデルからフォームセットを作る</span></a>.</p>\n</aside>\n</section>\n<section id=\"limiting-the-maximum-number-of-forms\">\n<span id=\"formsets-max-num\"></span><h2>フォームの最大表示数を制限する<a class=\"heading-anchor\" href=\"#limiting-the-maximum-number-of-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/forms/formsets/#django.forms.formsets.formset_factory\" title=\"django.forms.formsets.formset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">formset_factory()</span></code></a> に <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> パラメータを渡すと、フォームセットが表示するフォームの数を制限できます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">extra</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"n\">max_num</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"n\">formset</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-title&quot;&gt;Title:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-0-title&quot; id=&quot;id_form-0-title&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-pub_date&quot;&gt;Pub date:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-0-pub_date&quot; id=&quot;id_form-0-pub_date&quot;&gt;&lt;/div&gt;</span>\n</code></pre></div>\n<p>もし、<code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> の値が初期データ内に存在するオブジェクトの合計より大きい場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> を上限として空のフォームがフォームセットに追加されます。 フォームの合計の長さは <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> を超えることはできません。例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">extra=2</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num=2</span></code>、そしてフォームセットが 1 つの <code class=\"docutils literal notranslate\"><span class=\"pre\">initial</span></code> 項目で初期化される場合、この初期項目のフォームと 1 つの空のフォームが表示されます。</p>\n<p>初期データ内の項目数が <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> を超える場合、<code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> の値に関わらず全ての初期データのフォームが表示され、追加フォームは 1 つも表示されません。例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">extra=3</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num=1</span></code>、そしてフォームセットが 2 つの初期項目で初期化される場合、2 つのフォームが初期データとともに表示されます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> の値が <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> (デフォルト) だった場合、表示されるフォームの上限は大きな数になります (1000)。この数は、実際には制限がないと見なせるでしょう。</p>\n<p>By default, <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> only affects how many forms are displayed and does not\naffect validation. If <code class=\"docutils literal notranslate\"><span class=\"pre\">validate_max=True</span></code> is passed to the\n<a class=\"reference internal\" href=\"/ja/6.0/ref/forms/formsets/#django.forms.formsets.formset_factory\" title=\"django.forms.formsets.formset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">formset_factory()</span></code></a>, then <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> will affect\nvalidation. See <a class=\"reference internal\" href=\"#validate-max\"><span class=\"std std-ref\">validate_max</span></a>.</p>\n</section>\n<section id=\"limiting-the-maximum-number-of-instantiated-forms\">\n<span id=\"formsets-absolute-max\"></span><h2>インスタンス化できるフォームの数を制限する<a class=\"heading-anchor\" href=\"#limiting-the-maximum-number-of-instantiated-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/forms/formsets/#django.forms.formsets.formset_factory\" title=\"django.forms.formsets.formset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">formset_factory()</span></code></a> の <code class=\"docutils literal notranslate\"><span class=\"pre\">absolute_max</span></code> パラメータによって、 <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> データを与えたときにインスタンス化できるフォームの数を制限できます。これにより、偽造された <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> リクエストを使用したメモリ枯渇攻撃から守ることができます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms.formsets</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">absolute_max</span><span class=\"o\">=</span><span class=\"mi\">1500</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-TOTAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1501&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-INITIAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;0&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">forms</span><span class=\"p\">)</span>\n<span class=\"go\">1500</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">non_form_errors</span><span class=\"p\">()</span>\n<span class=\"go\">[&#39;Please submit at most 1000 forms.&#39;]</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">absolute_max</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> の場合、デフォルトは <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span> <span class=\"pre\">+</span> <span class=\"pre\">1000</span></code> になります (<code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> の場合、デフォルトは <code class=\"docutils literal notranslate\"><span class=\"pre\">2000</span></code> になります)。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">absolute_max</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> よりも小さい場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">ValueError</span></code> が発生します。</p>\n</section>\n<section id=\"formset-validation\">\n<h2>フォームセットのバリデーション<a class=\"heading-anchor\" href=\"#formset-validation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>フォームセットでのバリデーションは通常の <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> とほとんど同じです。フォームセットには便利な <code class=\"docutils literal notranslate\"><span class=\"pre\">is_valid</span></code> メソッドがあり、フォームセット内のすべてのフォームを検証できます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-TOTAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-INITIAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;0&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>フォームセットに何もデータを渡さなかったので、有効なフォームとみなされます。フォームセットは十分に賢いので、変更されていない余分なフォームは無視します。無効な記事を提供すると、:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-TOTAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;2&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-INITIAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;0&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Test&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1904-06-16&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Test&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>  <span class=\"c1\"># &lt;-- this date is missing but required</span>\n<span class=\"gp\">... </span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">errors</span>\n<span class=\"go\">[{}, {&#39;pub_date&#39;: [&#39;This field is required.&#39;]}]</span>\n</code></pre></div>\n<p>見て分かるように、 <code class=\"docutils literal notranslate\"><span class=\"pre\">formset.errors</span></code> はリストで、 そのエントリーはフォームセット内のフォームと一致します。 バリデーションは、2 つのフォームそれぞれに働いて、2 つ目の項目にエラーメッセージが表示されています。</p>\n<p>通常の <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> を使うときとまったく同じように、フォームセットのフォーム内のそれぞれのフィールドは、ブラウザのバリデーションのための <code class=\"docutils literal notranslate\"><span class=\"pre\">maxlength</span></code> のような HTML 属性を含むことができます。ただし、フォームセットのフォームフィールドは、<code class=\"docutils literal notranslate\"><span class=\"pre\">required</span></code> 属性を含みません。これは、フォームを追加したり削除するときにバリデーションが正しく働かない可能性があるためです。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.total_error_count\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">total_error_count</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.total_error_count\"><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\"><span class=\"pre\">total_error_count</span></code> メソッドを使用します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Using the previous example</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">errors</span>\n<span class=\"go\">[{}, {&#39;pub_date&#39;: [&#39;This field is required.&#39;]}]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">errors</span><span class=\"p\">)</span>\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">total_error_count</span><span class=\"p\">()</span>\n<span class=\"go\">1</span>\n</code></pre></div>\n<p>また、フォームのデータが初期データと異なるかどうか（つまり、フォームがデータなしで送信されたかどうか）もチェックできます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-TOTAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-INITIAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;0&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">has_changed</span><span class=\"p\">()</span>\n<span class=\"go\">False</span>\n</code></pre></div>\n<section id=\"understanding-the-managementform\">\n<span id=\"id1\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">ManagementForm</span></code> を理解する<a class=\"heading-anchor\" href=\"#understanding-the-managementform\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>上のフォームセットのデータに追加のデータ (<code class=\"docutils literal notranslate\"><span class=\"pre\">form-TOTAL_FORMS</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">form-INITIAL_FORMS</span></code>) が必要なことに気づいたかもしれません。このデータは <code class=\"docutils literal notranslate\"><span class=\"pre\">ManagementForm</span></code> に必要です。このフォームは、フォームセットに含まれるフォームのコレクションを管理するために使用されます。この管理データを渡さないと、フォームセットは無効になります:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Test&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">False</span>\n</code></pre></div>\n<p>これは、表示されているフォームインスタンスの数を追跡するために使用されます。 JavaScriptを使用して新しいフォームを追加する場合は、フォームのカウントフィールドもインクリメントする必要があります。 一方、既存のオブジェクトの削除を許可するためにJavaScriptを使用している場合は、<code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> データに <code class=\"docutils literal notranslate\"><span class=\"pre\">form-#-DELETE</span></code> を含めることで、削除対象のマークが適切に削除されていることを確認する必要があります。 すべてのフォームがそれにかかわらず <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> データに存在することが期待されます。</p>\n<p>ManagementFormは、フォームセット自体の属性として使用できます。 テンプレートでフォームセットをレンダリングするときは、<code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">my_formset.management_form</span> <span class=\"pre\">}}</span></code> (my_formsetは適切な名前に置き換えます)をレンダリングすることで、すべての管理データを含めることができます。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>ここで例として示した <code class=\"docutils literal notranslate\"><span class=\"pre\">form-TOTAL_FORMS</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">form-INITIAL_FORMS</span></code> フィールドの他に、管理フォームには <code class=\"docutils literal notranslate\"><span class=\"pre\">form-MIN_NUM_FORMS</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">form-MAX_NUM_FORMS</span></code> フィールドがあります。これらは管理フォームの残りの部分と一緒に出力されますが、これはクライアント側のコードの利便性のためだけのものです。これらのフィールドは必須ではないので、例の <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> データには表示されていません。</p>\n</aside>\n</section>\n<section id=\"total-form-count-and-initial-form-count\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">total_form_count</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">initial_form_count</span></code><a class=\"heading-anchor\" href=\"#total-form-count-and-initial-form-count\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">BaseFormSet</span></code> には、<code class=\"docutils literal notranslate\"><span class=\"pre\">ManagementForm</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">total_form_count</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">initial_form_count</span></code> と密接に関わる 2 つのメソッドがあります。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">total_form_count</span></code> は、対象のフィールドセット内のフォームの合計数を返します。<code class=\"docutils literal notranslate\"><span class=\"pre\">initial_form_count</span></code> は、記入前のフォームセット内のフォームの数を返し、またいくつのフォームが必須なのかを決めるためにも使われます。通常、これらのメソッドをオーバーライドする必要はありませんが、もし必要な場合はメソッドの動作を理解してからオーバーライドしてください。</p>\n</section>\n<section id=\"empty-form\">\n<span id=\"id2\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">empty_form</span></code><a class=\"heading-anchor\" href=\"#empty-form\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">BaseFormSet</span></code> には追加の属性 <code class=\"docutils literal notranslate\"><span class=\"pre\">empty_form</span></code> があり、<code class=\"docutils literal notranslate\"><span class=\"pre\">__prefix__</span></code> というプレフィックスとともにフォームのインスタンスを返します。これにより、JavaScript で動的にフォームを操作することが容易となります。</p>\n</section>\n<section id=\"error-messages\">\n<span id=\"formsets-error-messages\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">error_messages</span></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<p>引数 <code class=\"docutils literal notranslate\"><span class=\"pre\">error_messages</span></code> で、フォームセットが表示するデフォルトのメッセージを上書きできます。上書きしたいエラーメッセージにマッチするキーを持つ辞書を渡します。エラーメッセージのキーには <code class=\"docutils literal notranslate\"><span class=\"pre\">'too_few_forms'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'too_many_forms'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'missing_management_form'</span></code> があります。 <code class=\"docutils literal notranslate\"><span class=\"pre\">too_few_forms'</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">too_many_forms'</span></code> のエラーメッセージには <code class=\"docutils literal notranslate\"><span class=\"pre\">%(num)d</span></code> を含めることができ、それぞれ <code class=\"docutils literal notranslate\"><span class=\"pre\">min_num</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> に置き換えられます。</p>\n<p>例えば、管理フォームがない場合のデフォルトのエラーメッセージは以下の通りです:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">({})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">non_form_errors</span><span class=\"p\">()</span>\n<span class=\"go\">[&#39;ManagementForm data is missing or has been tampered with. Missing fields: form-TOTAL_FORMS, form-INITIAL_FORMS. You may need to file a bug report if the issue persists.&#39;]</span>\n</code></pre></div>\n<p>そしてこれはカスタムエラーメッセージです:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"p\">{},</span> <span class=\"n\">error_messages</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;missing_management_form&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Sorry, something went wrong.&quot;</span><span class=\"p\">}</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">non_form_errors</span><span class=\"p\">()</span>\n<span class=\"go\">[&#39;Sorry, something went wrong.&#39;]</span>\n</code></pre></div>\n</section>\n<section id=\"custom-formset-validation\">\n<h3>フォームセットのバリデーションをカスタマイズする<a class=\"heading-anchor\" href=\"#custom-formset-validation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>フォームセットには <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> クラスと同じような <code class=\"docutils literal notranslate\"><span class=\"pre\">clean</span></code> メソッドがあります。ここで、フォームセットレベルで動作する独自のバリデーションを定義します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ValidationError</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseFormSet</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BaseArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseFormSet</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span><span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;Checks that no two articles have the same title.&quot;&quot;&quot;</span>\n<span class=\"gp\">... </span>        <span class=\"k\">if</span> <span class=\"nb\">any</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">errors</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>            <span class=\"c1\"># Don&#39;t bother validating the formset unless each form is valid on its own</span>\n<span class=\"gp\">... </span>            <span class=\"k\">return</span>\n<span class=\"gp\">... </span>        <span class=\"n\">titles</span> <span class=\"o\">=</span> <span class=\"nb\">set</span><span class=\"p\">()</span>\n<span class=\"gp\">... </span>        <span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">forms</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>            <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">can_delete</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_should_delete_form</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>                <span class=\"k\">continue</span>\n<span class=\"gp\">... </span>            <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span>            <span class=\"k\">if</span> <span class=\"n\">title</span> <span class=\"ow\">in</span> <span class=\"n\">titles</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>                <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Articles in a set must have distinct titles.&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span>            <span class=\"n\">titles</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">formset</span><span class=\"o\">=</span><span class=\"n\">BaseArticleFormSet</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-TOTAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;2&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-INITIAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;0&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Test&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1904-06-16&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Test&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1912-06-23&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">errors</span>\n<span class=\"go\">[{}, {}]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">non_form_errors</span><span class=\"p\">()</span>\n<span class=\"go\">[&#39;Articles in a set must have distinct titles.&#39;]</span>\n</code></pre></div>\n<p>フォームセットの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean</span></code> メソッドは、<code class=\"docutils literal notranslate\"><span class=\"pre\">Form.clean</span></code> メソッドが呼ばれた後に呼び出されます。エラーを取得するには、フォームセットの <code class=\"docutils literal notranslate\"><span class=\"pre\">non_form_errors()</span></code> メソッドを使います。</p>\n<p>フォーム以外のエラーは、フォーム固有のエラーと区別するために <code class=\"docutils literal notranslate\"><span class=\"pre\">nonform</span></code> という追加のクラスでレンダリングされます。たとえば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">formset.non_form_errors</span> <span class=\"pre\">}}</span></code> は次のようになります:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">ul</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;errorlist nonform&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>Articles in a set must have distinct titles.<span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"validating-the-number-of-forms-in-a-formset\">\n<h2>フォームセット内のフォームの数を検証する<a class=\"heading-anchor\" href=\"#validating-the-number-of-forms-in-a-formset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>送信されたフォームの最小および最大数を検証するために、Django にはいくつかの方法が用意されています。フォームの数のバリデーションをさらにカスタマイズする必要があるときは、カスタムのフォームセットバリデーションを使用する必要があります。</p>\n<section id=\"validate-max\">\n<span id=\"id3\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">validate_max</span></code><a class=\"heading-anchor\" href=\"#validate-max\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/forms/formsets/#django.forms.formsets.formset_factory\" title=\"django.forms.formsets.formset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">formset_factory()</span></code></a> に <code class=\"docutils literal notranslate\"><span class=\"pre\">validate_max=True</span></code> が渡された場合、データセット内のフォーム数から削除マークが付けられたフォーム数を除いた数が <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> 以下であるかどうかも検証されます。</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">max_num</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">validate_max</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-TOTAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;2&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-INITIAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;0&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Test&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1904-06-16&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Test 2&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1912-06-23&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">errors</span>\n<span class=\"go\">[{}, {}]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">non_form_errors</span><span class=\"p\">()</span>\n<span class=\"go\">[&#39;Please submit at most 1 form.&#39;]</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">validate_max=True</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> に対して厳密にバリデーションを行います。たとえ <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> を超過した原因が初期データの量が多すぎたことだったとしてもです。</p>\n<p>エラーメッセージは <a class=\"reference internal\" href=\"#formsets-error-messages\"><span class=\"std std-ref\">error_messages</span></a> 引数に <code class=\"docutils literal notranslate\"><span class=\"pre\">'too_many_forms'</span></code> メッセージを渡すことでカスタマイズできます。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">validate_max</span></code> に関係なく、データセット内のフォームの数が <code class=\"docutils literal notranslate\"><span class=\"pre\">absolute_max</span></code> を超えた場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">validate_max</span></code> が指定されている場合と同様にフォームのバリデーションは失敗し、さらに最初の <code class=\"docutils literal notranslate\"><span class=\"pre\">absolute_max</span></code> 内のフォームのみがバリデートされます。残りは完全に切り捨てられます。これは POST リクエストを偽装してメモリを使い果たす攻撃から守るためです。詳細は <a class=\"reference internal\" href=\"#formsets-absolute-max\"><span class=\"std std-ref\">インスタンス化できるフォームの数を制限する</span></a> を参照してください。</p>\n</aside>\n</section>\n<section id=\"validate-min\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">validate_min</span></code><a class=\"heading-anchor\" href=\"#validate-min\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/forms/formsets/#django.forms.formsets.formset_factory\" title=\"django.forms.formsets.formset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">formset_factory()</span></code></a> に <code class=\"docutils literal notranslate\"><span class=\"pre\">validate_min=True</span></code> が渡された場合、バリデーションはデータセット内のフォームの数から削除マークが付けられたものを除いた数が <code class=\"docutils literal notranslate\"><span class=\"pre\">min_num</span></code> 以上であることもチェックします。</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">min_num</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"n\">validate_min</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-TOTAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;2&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-INITIAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;0&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Test&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1904-06-16&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Test 2&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1912-06-23&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">errors</span>\n<span class=\"go\">[{}, {}]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">non_form_errors</span><span class=\"p\">()</span>\n<span class=\"go\">[&#39;Please submit at least 3 forms.&#39;]</span>\n</code></pre></div>\n<p>エラーメッセージは <a class=\"reference internal\" href=\"#formsets-error-messages\"><span class=\"std std-ref\">error_messages</span></a> 引数に <code class=\"docutils literal notranslate\"><span class=\"pre\">'too_few_forms'</span></code> メッセージを渡すことでカスタマイズできます。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">validate_min</span></code> に関係なく、フォームセットにデータが含まれていない場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span> <span class=\"pre\">+</span> <span class=\"pre\">min_num</span></code> 空のフォームが表示されます。</p>\n</aside>\n</section>\n</section>\n<section id=\"dealing-with-ordering-and-deletion-of-forms\">\n<h2>フォームのソートと削除に対応させる<a class=\"heading-anchor\" href=\"#dealing-with-ordering-and-deletion-of-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/forms/formsets/#django.forms.formsets.formset_factory\" title=\"django.forms.formsets.formset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">formset_factory()</span></code></a> には、フォームセット内のフォームの順序およびフォームセットからのフォームの削除に役立つ 2 つのオプション引数があります。</p>\n<section id=\"can-order\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">can_order</span></code><a class=\"heading-anchor\" href=\"#can-order\"><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.formsets.BaseFormSet.can_order\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">can_order</span></span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.can_order\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>デフォルト値: <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code></p>\n<p>下記のように、ソート可能なフォームセットを作成できます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">can_order</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"p\">[</span>\n<span class=\"gp\">... </span>        <span class=\"p\">{</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Article #1&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">:</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2008</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">)},</span>\n<span class=\"gp\">... </span>        <span class=\"p\">{</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Article #2&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">:</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2008</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">11</span><span class=\"p\">)},</span>\n<span class=\"gp\">... </span>    <span class=\"p\">]</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"n\">formset</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-title&quot;&gt;Title:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-0-title&quot; value=&quot;Article #1&quot; id=&quot;id_form-0-title&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-pub_date&quot;&gt;Pub date:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-0-pub_date&quot; value=&quot;2008-05-10&quot; id=&quot;id_form-0-pub_date&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-ORDER&quot;&gt;Order:&lt;/label&gt;&lt;input type=&quot;number&quot; name=&quot;form-0-ORDER&quot; value=&quot;1&quot; id=&quot;id_form-0-ORDER&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-1-title&quot;&gt;Title:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-1-title&quot; value=&quot;Article #2&quot; id=&quot;id_form-1-title&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-1-pub_date&quot;&gt;Pub date:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-1-pub_date&quot; value=&quot;2008-05-11&quot; id=&quot;id_form-1-pub_date&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-1-ORDER&quot;&gt;Order:&lt;/label&gt;&lt;input type=&quot;number&quot; name=&quot;form-1-ORDER&quot; value=&quot;2&quot; id=&quot;id_form-1-ORDER&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-2-title&quot;&gt;Title:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-2-title&quot; id=&quot;id_form-2-title&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-2-pub_date&quot;&gt;Pub date:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-2-pub_date&quot; id=&quot;id_form-2-pub_date&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-2-ORDER&quot;&gt;Order:&lt;/label&gt;&lt;input type=&quot;number&quot; name=&quot;form-2-ORDER&quot; id=&quot;id_form-2-ORDER&quot;&gt;&lt;/div&gt;</span>\n</code></pre></div>\n<p>これで、各フォームにフィールドが追加されます。この新しいフィールドは <code class=\"docutils literal notranslate\"><span class=\"pre\">ORDER</span></code> という名前で、<code class=\"docutils literal notranslate\"><span class=\"pre\">forms.IntegerField</span></code> です。初期データのフォームには自動的に数値が割り当てられます。ユーザーがこれらの値を変更すると何が起こるかを見てみましょう:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-TOTAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;3&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-INITIAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;2&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Article #1&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;2008-05-10&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-ORDER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;2&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Article #2&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;2008-05-11&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-ORDER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-2-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Article #3&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-2-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;2008-05-01&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-2-ORDER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;0&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">}</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">data</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"p\">[</span>\n<span class=\"gp\">... </span>        <span class=\"p\">{</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Article #1&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">:</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2008</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">)},</span>\n<span class=\"gp\">... </span>        <span class=\"p\">{</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Article #2&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">:</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2008</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">11</span><span class=\"p\">)},</span>\n<span class=\"gp\">... </span>    <span class=\"p\">],</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">ordered_forms</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">{&#39;title&#39;: &#39;Article #3&#39;, &#39;pub_date&#39;: datetime.date(2008, 5, 1), &#39;ORDER&#39;: 0}</span>\n<span class=\"go\">{&#39;title&#39;: &#39;Article #2&#39;, &#39;pub_date&#39;: datetime.date(2008, 5, 11), &#39;ORDER&#39;: 1}</span>\n<span class=\"go\">{&#39;title&#39;: &#39;Article #1&#39;, &#39;pub_date&#39;: datetime.date(2008, 5, 10), &#39;ORDER&#39;: 2}</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet\" title=\"django.forms.formsets.BaseFormSet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseFormSet</span></code></a> には <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.ordering_widget\" title=\"django.forms.formsets.BaseFormSet.ordering_widget\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">ordering_widget</span></code></a> 属性と <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.get_ordering_widget\" title=\"django.forms.formsets.BaseFormSet.get_ordering_widget\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_ordering_widget()</span></code></a> メソッドがあり、 <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.can_order\" title=\"django.forms.formsets.BaseFormSet.can_order\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">can_order</span></code></a> で使用するウィジェットを制御します。</p>\n<section id=\"ordering-widget\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">ordering_widget</span></code><a class=\"heading-anchor\" href=\"#ordering-widget\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.ordering_widget\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">ordering_widget</span></span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.ordering_widget\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>デフォルト値: <a class=\"reference internal\" href=\"/ja/6.0/ref/forms/widgets/#django.forms.NumberInput\" title=\"django.forms.NumberInput\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">NumberInput</span></code></a></p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">ordering_widget</span></code> をセットすると、 <code class=\"docutils literal notranslate\"><span class=\"pre\">can_order</span></code> で使用するウィジェットクラスを指定できます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseFormSet</span><span class=\"p\">,</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BaseArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseFormSet</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"n\">ordering_widget</span> <span class=\"o\">=</span> <span class=\"n\">HiddenInput</span>\n<span class=\"gp\">...</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">formset</span><span class=\"o\">=</span><span class=\"n\">BaseArticleFormSet</span><span class=\"p\">,</span> <span class=\"n\">can_order</span><span class=\"o\">=</span><span class=\"kc\">True</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"get-ordering-widget\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_ordering_widget</span></code><a class=\"heading-anchor\" href=\"#get-ordering-widget\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.get_ordering_widget\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_ordering_widget</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.get_ordering_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\"><span class=\"pre\">can_order</span></code> で使用するウィジェットのインスタンスを指定する必要がある場合は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_ordering_widget()</span></code> をオーバーライドします:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseFormSet</span><span class=\"p\">,</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BaseArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseFormSet</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_ordering_widget</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>        <span class=\"k\">return</span> <span class=\"n\">HiddenInput</span><span class=\"p\">(</span><span class=\"n\">attrs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;ordering&quot;</span><span class=\"p\">})</span>\n<span class=\"gp\">...</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">formset</span><span class=\"o\">=</span><span class=\"n\">BaseArticleFormSet</span><span class=\"p\">,</span> <span class=\"n\">can_order</span><span class=\"o\">=</span><span class=\"kc\">True</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"can-delete\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">can_delete</span></code><a class=\"heading-anchor\" href=\"#can-delete\"><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.formsets.BaseFormSet.can_delete\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">can_delete</span></span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.can_delete\"><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\"><span class=\"pre\">False</span></code></p>\n<p>削除するフォームを選択できるフォームセットを作成できます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">can_delete</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"p\">[</span>\n<span class=\"gp\">... </span>        <span class=\"p\">{</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Article #1&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">:</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2008</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">)},</span>\n<span class=\"gp\">... </span>        <span class=\"p\">{</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Article #2&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">:</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2008</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">11</span><span class=\"p\">)},</span>\n<span class=\"gp\">... </span>    <span class=\"p\">]</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"n\">formset</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-title&quot;&gt;Title:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-0-title&quot; value=&quot;Article #1&quot; id=&quot;id_form-0-title&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-pub_date&quot;&gt;Pub date:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-0-pub_date&quot; value=&quot;2008-05-10&quot; id=&quot;id_form-0-pub_date&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-DELETE&quot;&gt;Delete:&lt;/label&gt;&lt;input type=&quot;checkbox&quot; name=&quot;form-0-DELETE&quot; id=&quot;id_form-0-DELETE&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-1-title&quot;&gt;Title:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-1-title&quot; value=&quot;Article #2&quot; id=&quot;id_form-1-title&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-1-pub_date&quot;&gt;Pub date:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-1-pub_date&quot; value=&quot;2008-05-11&quot; id=&quot;id_form-1-pub_date&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-1-DELETE&quot;&gt;Delete:&lt;/label&gt;&lt;input type=&quot;checkbox&quot; name=&quot;form-1-DELETE&quot; id=&quot;id_form-1-DELETE&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-2-title&quot;&gt;Title:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-2-title&quot; id=&quot;id_form-2-title&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-2-pub_date&quot;&gt;Pub date:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-2-pub_date&quot; id=&quot;id_form-2-pub_date&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-2-DELETE&quot;&gt;Delete:&lt;/label&gt;&lt;input type=&quot;checkbox&quot; name=&quot;form-2-DELETE&quot; id=&quot;id_form-2-DELETE&quot;&gt;&lt;/div&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">can_order</span></code> と同様に、各フォームに <code class=\"docutils literal notranslate\"><span class=\"pre\">DELETE</span></code> という名前の新しいフィールドが追加されます。このフィールドは <code class=\"docutils literal notranslate\"><span class=\"pre\">forms.BooleanField</span></code> です。削除フィールドのいずれかをマークしてデータが渡されると、それらに <code class=\"docutils literal notranslate\"><span class=\"pre\">deleted_forms</span></code> でアクセスできます。</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-TOTAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;3&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-INITIAL_FORMS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;2&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Article #1&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;2008-05-10&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-0-DELETE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;on&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Article #2&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;2008-05-11&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-1-DELETE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-2-title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-2-pub_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;form-2-DELETE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">}</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">data</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"p\">[</span>\n<span class=\"gp\">... </span>        <span class=\"p\">{</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Article #1&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">:</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2008</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">)},</span>\n<span class=\"gp\">... </span>        <span class=\"p\">{</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Article #2&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">:</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2008</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">11</span><span class=\"p\">)},</span>\n<span class=\"gp\">... </span>    <span class=\"p\">],</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"p\">[</span><span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span> <span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">deleted_forms</span><span class=\"p\">]</span>\n<span class=\"go\">[{&#39;title&#39;: &#39;Article #1&#39;, &#39;pub_date&#39;: datetime.date(2008, 5, 10), &#39;DELETE&#39;: True}]</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/6.0/topics/forms/modelforms/#django.forms.models.BaseModelFormSet\" title=\"django.forms.models.BaseModelFormSet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelFormSet</span></code></a> を使っている場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">formset.save()</span></code> を呼び出すと、削除されたフォームのモデルインスタンスは削除されます。</p>\n<p>If you call <code class=\"docutils literal notranslate\"><span class=\"pre\">formset.save(commit=False)</span></code>, objects will not be deleted\nautomatically. You'll need to call <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> on each of the\n<a class=\"reference internal\" href=\"/ja/6.0/topics/forms/modelforms/#django.forms.models.BaseModelFormSet.deleted_objects\" title=\"django.forms.models.BaseModelFormSet.deleted_objects\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">formset.deleted_objects</span></code></a> to actually delete\nthem:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">instances</span> <span class=\"o\">=</span> <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">commit</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">obj</span> <span class=\"ow\">in</span> <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">deleted_objects</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n<span class=\"gp\">...</span>\n</code></pre></div>\n<p>一方、普通の <code class=\"docutils literal notranslate\"><span class=\"pre\">FormSet</span></code> を使用している場合は、フォームを削除するという一般的な概念がないため、あなた自身でフォームセットの <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> メソッドで <code class=\"docutils literal notranslate\"><span class=\"pre\">formset.deleted_forms</span></code> を処理することになります。</p>\n<p><a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet\" title=\"django.forms.formsets.BaseFormSet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseFormSet</span></code></a> には <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.deletion_widget\" title=\"django.forms.formsets.BaseFormSet.deletion_widget\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">deletion_widget</span></code></a> 属性と <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.get_deletion_widget\" title=\"django.forms.formsets.BaseFormSet.get_deletion_widget\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_deletion_widget()</span></code></a> メソッドもあり、 <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.can_delete\" title=\"django.forms.formsets.BaseFormSet.can_delete\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">can_delete</span></code></a> で使用するウィジェットを制御します。</p>\n<section id=\"deletion-widget\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">deletion_widget</span></code><a class=\"heading-anchor\" href=\"#deletion-widget\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.deletion_widget\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">deletion_widget</span></span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.deletion_widget\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>デフォルト値: <a class=\"reference internal\" href=\"/ja/6.0/ref/forms/widgets/#django.forms.CheckboxInput\" title=\"django.forms.CheckboxInput\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CheckboxInput</span></code></a></p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">delete_widget</span></code> をセットすると、 <code class=\"docutils literal notranslate\"><span class=\"pre\">can_delete</span></code> で使用するウィジェットクラスを指定できます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseFormSet</span><span class=\"p\">,</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BaseArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseFormSet</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"n\">deletion_widget</span> <span class=\"o\">=</span> <span class=\"n\">HiddenInput</span>\n<span class=\"gp\">...</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">formset</span><span class=\"o\">=</span><span class=\"n\">BaseArticleFormSet</span><span class=\"p\">,</span> <span class=\"n\">can_delete</span><span class=\"o\">=</span><span class=\"kc\">True</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"get-deletion-widget\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_deletion_widget</span></code><a class=\"heading-anchor\" href=\"#get-deletion-widget\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.get_deletion_widget\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_deletion_widget</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.get_deletion_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\"><span class=\"pre\">can_delete</span></code> で使用するウィジェットのインスタンスを指定する必要がある場合は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_deletion_widget()</span></code> をオーバーライドします:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseFormSet</span><span class=\"p\">,</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BaseArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseFormSet</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_deletion_widget</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>        <span class=\"k\">return</span> <span class=\"n\">HiddenInput</span><span class=\"p\">(</span><span class=\"n\">attrs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;deletion&quot;</span><span class=\"p\">})</span>\n<span class=\"gp\">...</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">formset</span><span class=\"o\">=</span><span class=\"n\">BaseArticleFormSet</span><span class=\"p\">,</span> <span class=\"n\">can_delete</span><span class=\"o\">=</span><span class=\"kc\">True</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"can-delete-extra\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">can_delete_extra</span></code><a class=\"heading-anchor\" href=\"#can-delete-extra\"><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.formsets.BaseFormSet.can_delete_extra\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">can_delete_extra</span></span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.can_delete_extra\"><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\"><span class=\"pre\">True</span></code></p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">can_delete=True</span></code> を設定しているときに <code class=\"docutils literal notranslate\"><span class=\"pre\">can_delete_extra=False</span></code> を指定すると、余分なフォームを削除するオプションがなくなります。</p>\n</section>\n</section>\n<section id=\"adding-additional-fields-to-a-formset\">\n<h2>フォームセットにフィールドを追加する<a class=\"heading-anchor\" href=\"#adding-additional-fields-to-a-formset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>フォームセットに追加のフィールドを追加する必要がある場合、これは簡単に実現できます。フォームセットの基底クラスには <code class=\"docutils literal notranslate\"><span class=\"pre\">add_fields</span></code> メソッドがあります。このメソッドをオーバーライドすることで、独自のフィールドを追加したり、 デフォルトのフィールドや属性を再定義したりすることができます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseFormSet</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BaseArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseFormSet</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">add_fields</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"p\">,</span> <span class=\"n\">index</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">add_fields</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">,</span> <span class=\"n\">index</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span>        <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">fields</span><span class=\"p\">[</span><span class=\"s2\">&quot;my_field&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">()</span>\n<span class=\"gp\">...</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">formset</span><span class=\"o\">=</span><span class=\"n\">BaseArticleFormSet</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"n\">formset</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-title&quot;&gt;Title:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-0-title&quot; id=&quot;id_form-0-title&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-pub_date&quot;&gt;Pub date:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-0-pub_date&quot; id=&quot;id_form-0-pub_date&quot;&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-my_field&quot;&gt;My field:&lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;form-0-my_field&quot; id=&quot;id_form-0-my_field&quot;&gt;&lt;/div&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"passing-custom-parameters-to-formset-forms\">\n<span id=\"custom-formset-form-kwargs\"></span><h2>フォームセットのフォームにカスタムパラメータを渡す<a class=\"heading-anchor\" href=\"#passing-custom-parameters-to-formset-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>フォームクラスには、<code class=\"docutils literal notranslate\"><span class=\"pre\">MyArticleForm</span></code> のようなカスタムパラメータを指定することがあります。フォームセットをインスタンス化するときに、このパラメータを渡すことができます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseFormSet</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyArticleForm</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">user</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">user</span>\n<span class=\"gp\">... </span>        <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><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">MyArticleForm</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">form_kwargs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;user&quot;</span><span class=\"p\">:</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"p\">})</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">form_kwargs</span></code> はフォームのインスタンスによって異なります。フォームセットの基底クラスには <code class=\"docutils literal notranslate\"><span class=\"pre\">get_form_kwargs</span></code> メソッドがあります。このメソッドは引数としてフォームセット内のフォームのインデックスを受け取ります。 <a class=\"reference internal\" href=\"#empty-form\"><span class=\"std std-ref\">empty_form</span></a> の場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> です:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseFormSet</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BaseArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseFormSet</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_form_kwargs</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">index</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>        <span class=\"n\">kwargs</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_form_kwargs</span><span class=\"p\">(</span><span class=\"n\">index</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span>        <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;custom_kwarg&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">index</span>\n<span class=\"gp\">... </span>        <span class=\"k\">return</span> <span class=\"n\">kwargs</span>\n<span class=\"gp\">...</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">MyArticleForm</span><span class=\"p\">,</span> <span class=\"n\">formset</span><span class=\"o\">=</span><span class=\"n\">BaseArticleFormSet</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"customizing-a-formset-s-prefix\">\n<span id=\"formset-prefix\"></span><h2>フォームセットのプレフィックスをカスタマイズする<a class=\"heading-anchor\" href=\"#customizing-a-formset-s-prefix\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>レンダリングされた HTML では、フォームセットは各フィールド名のプレフィックスを含みます。デフォルトではプレフィックスは <code class=\"docutils literal notranslate\"><span class=\"pre\">'form'</span></code> ですが、フォームセットの <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix</span></code> 引数を使用してカスタマイズすることもできます。</p>\n<p>たとえば、デフォルトの場合は次のように表示されます:</p>\n<div class=\"code-block\" data-language=\"html\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Html</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Html code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;id_form-0-title&quot;</span><span class=\"p\">&gt;</span>Title:<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;text&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;form-0-title&quot;</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;id_form-0-title&quot;</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>しかし、<code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleFormset(prefix='article')</span></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\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;id_article-0-title&quot;</span><span class=\"p\">&gt;</span>Title:<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;text&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;article-0-title&quot;</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;id_article-0-title&quot;</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>これは <a class=\"reference internal\" href=\"#multiple-formsets-in-view\"><span class=\"std std-ref\">ビュー</span></a> の中で複数のフォームセットを使いたいときに便利です。</p>\n</section>\n<section id=\"using-a-formset-in-views-and-templates\">\n<span id=\"formset-rendering\"></span><h2>ビューとテンプレートでフォームセットを使う<a class=\"heading-anchor\" href=\"#using-a-formset-in-views-and-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>フォームセットには、レンダリングに関連する以下の属性とメソッドがあります:</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.renderer\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">renderer</span></span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.renderer\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>フォームセットに使用する <a class=\"reference internal\" href=\"/ja/6.0/ref/forms/renderers/\"><span class=\"doc\">レンダラー</span></a> を指定します。デフォルトは <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-FORM_RENDERER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FORM_RENDERER</span></code></a> 設定で指定されたレンダラーです。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.template_name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">template_name</span></span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.template_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\"><span class=\"pre\">print(formset)</span></code> やテンプレート内で <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">formset</span> <span class=\"pre\">}}</span></code> を使ってフォームセットを文字列にキャストした場合にレンダリングされるテンプレートの名前です。</p>\n<p>デフォルトでは、レンダラーの <a class=\"reference internal\" href=\"/ja/6.0/ref/forms/renderers/#django.forms.renderers.BaseRenderer.formset_template_name\" title=\"django.forms.renderers.BaseRenderer.formset_template_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">formset_template_name</span></code></a> の値を返すプロパティです。テンプレート名に文字列を指定することで、特定のフォームセットクラスのテンプレート名を上書きできます。</p>\n<p>このテンプレートは、フォームセットの管理フォームをレンダリングするために使用され、フォームセット内の各フォームは、フォームの <a class=\"reference internal\" href=\"/ja/6.0/ref/forms/api/#django.forms.Form.template_name\" title=\"django.forms.Form.template_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">template_name</span></code></a> で定義されたテンプレートに従ってレンダリングされます。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.template_name_div\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">template_name_div</span></span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.template_name_div\"><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.formsets.BaseFormSet.as_div\" title=\"django.forms.formsets.BaseFormSet.as_div\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_div()</span></code></a> を呼び出す際に使用するテンプレートの名前です。デフォルトでは <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django/forms/formsets/div.html&quot;</span></code> です。このテンプレートはフォームセットの管理フォームをレンダリングし、 フォームセット内の各フォームをフォームの <a class=\"reference internal\" href=\"/ja/6.0/ref/forms/api/#django.forms.Form.as_div\" title=\"django.forms.Form.as_div\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_div()</span></code></a> メソッドに従ってレンダリングします。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.template_name_p\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">template_name_p</span></span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.template_name_p\"><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.formsets.BaseFormSet.as_p\" title=\"django.forms.formsets.BaseFormSet.as_p\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_p()</span></code></a> を呼び出す際に使用するテンプレートの名前です。デフォルトでは <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django/forms/formsets/p.html&quot;</span></code> です。このテンプレートはフォームセットの管理フォームをレンダリングし、 フォームセット内の各フォームをフォームの <a class=\"reference internal\" href=\"/ja/6.0/ref/forms/api/#django.forms.Form.as_p\" title=\"django.forms.Form.as_p\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_p()</span></code></a> メソッドに従ってレンダリングします。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.template_name_table\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">template_name_table</span></span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.template_name_table\"><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.formsets.BaseFormSet.as_table\" title=\"django.forms.formsets.BaseFormSet.as_table\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_table()</span></code></a> を呼び出す際に使用するテンプレートの名前です。デフォルトでは <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django/forms/formsets/table.html&quot;</span></code> です。このテンプレートはフォームセットの管理フォームをレンダリングし、 フォームセット内の各フォームをフォームの <a class=\"reference internal\" href=\"/ja/6.0/ref/forms/api/#django.forms.Form.as_table\" title=\"django.forms.Form.as_table\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_table()</span></code></a> メソッドに従ってレンダリングします。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.template_name_ul\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">template_name_ul</span></span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.template_name_ul\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.as_ul\" title=\"django.forms.formsets.BaseFormSet.as_ul\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_ul()</span></code></a> を呼び出す際に使用するテンプレートの名前です。デフォルトでは <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django/forms/formsets/ul.html&quot;</span></code> です。このテンプレートはフォームセットの管理フォームをレンダリングし、 フォームセット内の各フォームをフォームの <a class=\"reference internal\" href=\"/ja/6.0/ref/forms/api/#django.forms.Form.as_ul\" title=\"django.forms.Form.as_ul\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_ul()</span></code></a> メソッドに従ってレンダリングします。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.get_context\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_context</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.get_context\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>テンプレート内のフォームセットをレンダリングするためのコンテキストを返します。</p>\n<p>利用可能なコンテキストは次のとおりです。</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">formset</span></code>: フォームセットのインスタンス。</p></li>\n</ul>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.render\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">render</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">template_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">context</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">renderer</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.render\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>render メソッドは <code class=\"docutils literal notranslate\"><span class=\"pre\">str__</span></code> メソッド、 <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.as_div\" title=\"django.forms.formsets.BaseFormSet.as_div\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_div()</span></code></a> メソッド、 <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.as_p\" title=\"django.forms.formsets.BaseFormSet.as_p\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_p()</span></code></a> メソッド、 <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.as_ul\" title=\"django.forms.formsets.BaseFormSet.as_ul\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_ul()</span></code></a> メソッド、 <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.as_table\" title=\"django.forms.formsets.BaseFormSet.as_table\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_table()</span></code></a> メソッドから呼び出されます。すべての引数は省略可能で、デフォルトは下記です:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code>: <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.template_name\" title=\"django.forms.formsets.BaseFormSet.template_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">template_name</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code>: <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.get_context\" title=\"django.forms.formsets.BaseFormSet.get_context\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_context()</span></code></a> が返す値</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">renderer</span></code>: <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.renderer\" title=\"django.forms.formsets.BaseFormSet.renderer\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">renderer</span></code></a> が返す値</p></li>\n</ul>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.as_div\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">as_div</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.as_div\"><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.formsets.BaseFormSet.template_name_div\" title=\"django.forms.formsets.BaseFormSet.template_name_div\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">template_name_div</span></code></a> テンプレートでレンダリングします。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.as_p\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">as_p</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.as_p\"><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.formsets.BaseFormSet.template_name_p\" title=\"django.forms.formsets.BaseFormSet.template_name_p\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">template_name_p</span></code></a> テンプレートでレンダリングします。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.as_table\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">as_table</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.as_table\"><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.formsets.BaseFormSet.template_name_table\" title=\"django.forms.formsets.BaseFormSet.template_name_table\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">template_name_table</span></code></a> テンプレートでレンダリングします。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.formsets.BaseFormSet.as_ul\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">as_ul</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.formsets.BaseFormSet.as_ul\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>フォームセットを <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.template_name_ul\" title=\"django.forms.formsets.BaseFormSet.template_name_ul\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">template_name_ul</span></code></a> テンプレートでレンダリングします。</p>\n</dd></dl>\n\n<p>ビュー内でフォームセットを使用するのは、通常の <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></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=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">manage_articles</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        <span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"c1\"># do something with the formset.cleaned_data</span>\n            <span class=\"k\">pass</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s2\">&quot;manage_articles.html&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;formset&quot;</span><span class=\"p\">:</span> <span class=\"n\">formset</span><span class=\"p\">})</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">manage_articles.html</span></code> テンプレートは次のようになります:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">form</span> <span class=\"na\">method</span><span class=\"o\">=</span><span class=\"s\">&quot;post&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">formset.management_form</span> <span class=\"cp\">}}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">table</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">form</span> <span class=\"k\">in</span> <span class=\"nv\">formset</span> <span class=\"cp\">%}</span>\n        <span class=\"cp\">{{</span> <span class=\"nv\">form</span> <span class=\"cp\">}}</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">table</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>ただし、フォームセット自体が管理フォームを処理するためのちょっとしたショートカットもあります。</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">form</span> <span class=\"na\">method</span><span class=\"o\">=</span><span class=\"s\">&quot;post&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">table</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{{</span> <span class=\"nv\">formset</span> <span class=\"cp\">}}</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">table</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>上記は、フォームセットクラスで <a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.render\" title=\"django.forms.formsets.BaseFormSet.render\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">BaseFormSet.render()</span></code></a> メソッドを呼び出すことになります。これにより、<a class=\"reference internal\" href=\"#django.forms.formsets.BaseFormSet.template_name\" title=\"django.forms.formsets.BaseFormSet.template_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">template_name</span></code></a> 属性で指定されたテンプレートを使用してフォームセットがレンダリングされます。フォームと同様に、デフォルトではフォームセットは <code class=\"docutils literal notranslate\"><span class=\"pre\">as_div</span></code> としてレンダリングされ、その他にも <code class=\"docutils literal notranslate\"><span class=\"pre\">as_p</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">as_ul</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">as_table</span></code> などの補助メソッドが使用可能です。フォームセットのレンダリングは、<code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code> 属性を指定することでカスタマイズできます。また、より一般的には <a class=\"reference internal\" href=\"/ja/6.0/ref/forms/renderers/#overriding-built-in-formset-templates\"><span class=\"std std-ref\">デフォルトのテンプレートのオーバーライド</span></a> によってカスタマイズできます。</p>\n<section id=\"manually-rendered-can-delete-and-can-order\">\n<span id=\"id4\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">can_delete</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">can_order</span></code> のときに手動でレンダリングする<a class=\"heading-anchor\" href=\"#manually-rendered-can-delete-and-can-order\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>テンプレート内で手動でフィールドをレンダリングする場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">can_delete</span></code> パラメータを <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">form.DELETE</span> <span class=\"pre\">}}</span></code> でレンダリングできます:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">form</span> <span class=\"na\">method</span><span class=\"o\">=</span><span class=\"s\">&quot;post&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">formset.management_form</span> <span class=\"cp\">}}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">form</span> <span class=\"k\">in</span> <span class=\"nv\">formset</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">form.title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">form.pub_date</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n            <span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">formset.can_delete</span> <span class=\"cp\">%}</span>\n                <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">form.DELETE</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n            <span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>同様に、フォームセットに並び替えの機能 (<code class=\"docutils literal notranslate\"><span class=\"pre\">can_order=True</span></code>) がある場合,  <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">form.ORDER</span> <span class=\"pre\">}}</span></code> でレンダリングできます。</p>\n</section>\n<section id=\"using-more-than-one-formset-in-a-view\">\n<span id=\"multiple-formsets-in-view\"></span><h3>ビューで複数のフォームセットを使う<a class=\"heading-anchor\" href=\"#using-more-than-one-formset-in-a-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>必要に応じて、1 つのビューで複数のフォームセットを使用できます。フォームセットはその動作の多くをフォームから借用しています。そのため、<code class=\"docutils literal notranslate\"><span class=\"pre\">prefix</span></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=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">formset_factory</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span><span class=\"p\">,</span> <span class=\"n\">BookForm</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">manage_articles</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">ArticleFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">)</span>\n    <span class=\"n\">BookFormSet</span> <span class=\"o\">=</span> <span class=\"n\">formset_factory</span><span class=\"p\">(</span><span class=\"n\">BookForm</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        <span class=\"n\">article_formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">,</span> <span class=\"n\">prefix</span><span class=\"o\">=</span><span class=\"s2\">&quot;articles&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">book_formset</span> <span class=\"o\">=</span> <span class=\"n\">BookFormSet</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">,</span> <span class=\"n\">prefix</span><span class=\"o\">=</span><span class=\"s2\">&quot;books&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">article_formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span> <span class=\"ow\">and</span> <span class=\"n\">book_formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"c1\"># do something with the cleaned_data on the formsets.</span>\n            <span class=\"k\">pass</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">article_formset</span> <span class=\"o\">=</span> <span class=\"n\">ArticleFormSet</span><span class=\"p\">(</span><span class=\"n\">prefix</span><span class=\"o\">=</span><span class=\"s2\">&quot;articles&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">book_formset</span> <span class=\"o\">=</span> <span class=\"n\">BookFormSet</span><span class=\"p\">(</span><span class=\"n\">prefix</span><span class=\"o\">=</span><span class=\"s2\">&quot;books&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span>\n        <span class=\"n\">request</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;manage_articles.html&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;article_formset&quot;</span><span class=\"p\">:</span> <span class=\"n\">article_formset</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;book_formset&quot;</span><span class=\"p\">:</span> <span class=\"n\">book_formset</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>フォームセットは通常どおりレンダリングされます。ここで重要なのは、POST の場合とそうでない場合の両方で <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix</span></code> を渡す必要があるということです。</p>\n<p>各フォームセットの <a class=\"reference internal\" href=\"#formset-prefix\"><span class=\"std std-ref\">prefix</span></a> は、各フィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> の HTML 属性に追加されるデフォルトの <code class=\"docutils literal notranslate\"><span class=\"pre\">form</span></code> プレフィックスを置き換えます。</p>\n</section>\n</section>","rootId":"formsets","toc":[{"title":"フォームセットで初期データを指定する","anchor":"using-initial-data-with-a-formset","children":[]},{"title":"フォームの最大表示数を制限する","anchor":"limiting-the-maximum-number-of-forms","children":[]},{"title":"インスタンス化できるフォームの数を制限する","anchor":"limiting-the-maximum-number-of-instantiated-forms","children":[]},{"title":"フォームセットのバリデーション","anchor":"formset-validation","children":[{"title":"ManagementForm を理解する","anchor":"understanding-the-managementform","children":[]},{"title":"total_form_count と initial_form_count","anchor":"total-form-count-and-initial-form-count","children":[]},{"title":"empty_form","anchor":"empty-form","children":[]},{"title":"error_messages","anchor":"error-messages","children":[]},{"title":"フォームセットのバリデーションをカスタマイズする","anchor":"custom-formset-validation","children":[]}]},{"title":"フォームセット内のフォームの数を検証する","anchor":"validating-the-number-of-forms-in-a-formset","children":[{"title":"validate_max","anchor":"validate-max","children":[]},{"title":"validate_min","anchor":"validate-min","children":[]}]},{"title":"フォームのソートと削除に対応させる","anchor":"dealing-with-ordering-and-deletion-of-forms","children":[{"title":"can_order","anchor":"can-order","children":[{"title":"ordering_widget","anchor":"ordering-widget","children":[]},{"title":"get_ordering_widget","anchor":"get-ordering-widget","children":[]}]},{"title":"can_delete","anchor":"can-delete","children":[{"title":"deletion_widget","anchor":"deletion-widget","children":[]},{"title":"get_deletion_widget","anchor":"get-deletion-widget","children":[]}]},{"title":"can_delete_extra","anchor":"can-delete-extra","children":[]}]},{"title":"フォームセットにフィールドを追加する","anchor":"adding-additional-fields-to-a-formset","children":[]},{"title":"フォームセットのフォームにカスタムパラメータを渡す","anchor":"passing-custom-parameters-to-formset-forms","children":[]},{"title":"フォームセットのプレフィックスをカスタマイズする","anchor":"customizing-a-formset-s-prefix","children":[]},{"title":"ビューとテンプレートでフォームセットを使う","anchor":"using-a-formset-in-views-and-templates","children":[{"title":"can_delete や can_order のときに手動でレンダリングする","anchor":"manually-rendered-can-delete-and-can-order","children":[]},{"title":"ビューで複数のフォームセットを使う","anchor":"using-more-than-one-formset-in-a-view","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/6.0/topics/"},{"docname":"topics/forms/index","title":"フォームを使う","url":"/ja/6.0/topics/forms/"}],"prev":{"docname":"topics/forms/index","title":"フォームを使う","url":"/ja/6.0/topics/forms/"},"next":{"docname":"topics/forms/modelforms","title":"モデルからフォームを作成する","url":"/ja/6.0/topics/forms/modelforms/"},"formats":{"html":"/ja/6.0/topics/forms/formsets/","markdown":"/ja/6.0/topics/forms/formsets.md","json":"/ja/6.0/topics/forms/formsets.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/forms/formsets.txt","official":"https://docs.djangoproject.com/ja/6.0/topics/forms/formsets/","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","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}