{"title":"モデルからフォームを作成する","version":"4.1","locale":"ja","docname":"topics/forms/modelforms","url":"/ja/4.1/topics/forms/modelforms/","canonical":"https://djangodocs.dev/ja/4.1/topics/forms/modelforms/","summary":"ModelForm Link to this heading # class ModelForm Link to this definition # データベース中心のアプリケーションを作成している場合、Django モデルに密接にマップするフォームを使うことになるでしょう。例えば、 BlogComment…","html":"<h1>モデルからフォームを作成する<a class=\"heading-anchor\" href=\"#creating-forms-from-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"modelform\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code><a class=\"heading-anchor\" href=\"#modelform\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelForm\">\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\">ModelForm</span></span><a class=\"heading-anchor\" href=\"#django.forms.ModelForm\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>データベース中心のアプリケーションを作成している場合、Django モデルに密接にマップするフォームを使うことになるでしょう。例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">BlogComment</span></code> モデルを持っていて、閲覧者がコメントを送信できるフォームを作成したくなったとしましょう。この場合、すでにモデル内にフィールドが定義されているので、フォーム内にフィールドタイプを改めて定義するのは冗長でしょう。</p>\n<p>このためDjango には、Django モデルから <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> クラスを生成できるようなヘルパークラスを用意してあります。</p>\n<p>例:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ModelForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span>\n\n<span class=\"go\"># Create the form class.</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\">ModelForm</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Article</span>\n<span class=\"gp\">... </span>        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;content&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;reporter&#39;</span><span class=\"p\">]</span>\n\n<span class=\"go\"># Creating a form to add an article.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">ArticleForm</span><span class=\"p\">()</span>\n\n<span class=\"go\"># Creating a form to change an existing article.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">article</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</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\">form</span> <span class=\"o\">=</span> <span class=\"n\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">article</span><span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"field-types\">\n<h3>フィールドの型<a class=\"heading-anchor\" href=\"#field-types\"><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\">fields</span></code> 属性で指定された順番でフォームフィールドを有します。</p>\n<p>各モデルフィールドは、対応するデフォルトのフォームフィールドを持ちます。例えば、モデル上の <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code>  はフォーム上で <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code> として表現されます。モデル <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">MultipleChoiceField</span></code> として表現されます。 以下は、各フィールドの対応表です:</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>モデルフィールド</p></th>\n<th class=\"head\"><p>フォームフィールド</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AutoField</span></code></a></p></td>\n<td><p>フォーム上では表示されません。</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.BigAutoField\" title=\"django.db.models.BigAutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BigAutoField</span></code></a></p></td>\n<td><p>フォーム上では表示されません。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.BigIntegerField\" title=\"django.db.models.BigIntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BigIntegerField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a> で <code class=\"docutils literal notranslate\"><span class=\"pre\">min_value</span></code> が -9223372036854775808 から <code class=\"docutils literal notranslate\"><span class=\"pre\">max_value</span></code> に 9223372036854775807 セットされます。</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.BinaryField\" title=\"django.db.models.BinaryField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BinaryField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a> がモデルフィールド上で <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> にセットされていた場合、<a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> です。それ以外の場合フォーム内で描画されません。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.BooleanField\" title=\"django.db.models.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BooleanField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.BooleanField\" title=\"django.forms.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BooleanField</span></code></a> です。<code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code> の場合は <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.NullBooleanField\" title=\"django.forms.NullBooleanField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">NullBooleanField</span></code></a> です。</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> で、<code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> はモデルフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> にセットされます。また <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code> の場合 <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.CharField.empty_value\" title=\"django.forms.CharField.empty_value\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">empty_value</span></code></a> が <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> にセットされます。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.DateField\" title=\"django.forms.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.DateTimeField\" title=\"django.forms.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.DecimalField\" title=\"django.db.models.DecimalField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DecimalField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.DecimalField\" title=\"django.forms.DecimalField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DecimalField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.DurationField\" title=\"django.db.models.DurationField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DurationField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.DurationField\" title=\"django.forms.DurationField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DurationField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.EmailField\" title=\"django.db.models.EmailField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.EmailField\" title=\"django.forms.EmailField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.FilePathField\" title=\"django.db.models.FilePathField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FilePathField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.FilePathField\" title=\"django.forms.FilePathField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FilePathField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.FloatField\" title=\"django.db.models.FloatField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FloatField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.FloatField\" title=\"django.forms.FloatField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FloatField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.ModelChoiceField\" title=\"django.forms.ModelChoiceField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelChoiceField</span></code></a>\n(see below)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.ImageField\" title=\"django.db.models.ImageField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ImageField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.ImageField\" title=\"django.forms.ImageField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ImageField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.IntegerField\" title=\"django.db.models.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">IPAddressField</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">IPAddressField</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.GenericIPAddressField\" title=\"django.db.models.GenericIPAddressField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericIPAddressField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.GenericIPAddressField\" title=\"django.forms.GenericIPAddressField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericIPAddressField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JSONField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.JSONField\" title=\"django.forms.JSONField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JSONField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.ModelMultipleChoiceField\" title=\"django.forms.ModelMultipleChoiceField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelMultipleChoiceField</span></code></a> (以下を参照)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.PositiveBigIntegerField\" title=\"django.db.models.PositiveBigIntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PositiveBigIntegerField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.PositiveIntegerField\" title=\"django.db.models.PositiveIntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PositiveIntegerField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.PositiveSmallIntegerField\" title=\"django.db.models.PositiveSmallIntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PositiveSmallIntegerField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.SlugField\" title=\"django.db.models.SlugField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SlugField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.SlugField\" title=\"django.forms.SlugField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SlugField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.SmallAutoField\" title=\"django.db.models.SmallAutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SmallAutoField</span></code></a></p></td>\n<td><p>フォーム上では表示されません。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.SmallIntegerField\" title=\"django.db.models.SmallIntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SmallIntegerField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.TextField\" title=\"django.db.models.TextField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TextField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> で <code class=\"docutils literal notranslate\"><span class=\"pre\">widget=forms.Textarea</span></code> です。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.TimeField\" title=\"django.db.models.TimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TimeField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.TimeField\" title=\"django.forms.TimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TimeField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.URLField\" title=\"django.db.models.URLField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">URLField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.URLField\" title=\"django.forms.URLField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">URLField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.UUIDField\" title=\"django.db.models.UUIDField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UUIDField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.UUIDField\" title=\"django.forms.UUIDField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UUIDField</span></code></a></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>お気付きかもしれませんが、 <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> の 2 つのモデルフィールドは特殊なケースとなります:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">django.forms.ModelChoiceField</span></code> によって表現され、モデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> を選択肢として持つ <code class=\"docutils literal notranslate\"><span class=\"pre\">ChoiceField</span></code> です。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">django.forms.ModelMultipleChoiceField</span></code> によって表現され、モデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> を選択肢として持つ <code class=\"docutils literal notranslate\"><span class=\"pre\">MultipleChoiceField</span></code> です。</p></li>\n</ul>\n<p>加えて、生成されたフォームフィールドはそれぞれ以下の通り属性がセットされます:</p>\n<ul class=\"simple\">\n<li><p>モデルフィールドに <code class=\"docutils literal notranslate\"><span class=\"pre\">blank=True</span></code> が設定されている場合、フォームフィールド上で <code class=\"docutils literal notranslate\"><span class=\"pre\">required</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> にセットされます。それ以外の場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">required=True</span></code> となります。</p></li>\n<li><p>フォームフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">label</span></code> はモデルフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code> の最初の文字を大文字にしたものがセットされます。</p></li>\n<li><p>フォームフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">help_text</span></code> はモデルフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">help_text</span></code> がセットされます。</p></li>\n<li><p>モデルフィールドに <code class=\"docutils literal notranslate\"><span class=\"pre\">choices</span></code> が設定されている場合、フォームフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">widget</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">Select</span></code> にセットされ、選択肢にはモデルフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">choices</span></code> が使われます。通常、選択肢には空欄の選択肢が追加され、デフォルトで選択されることになります。フィールドが required の場合、ユーザは選択肢を選ぶ必要があります。モデルフィールドに <code class=\"docutils literal notranslate\"><span class=\"pre\">blank=False</span></code> および明示的な <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> 値が設定されている場合、空欄の選択肢は表示されません (代わりに <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> 値が選択された状態で表示されます) 。</p></li>\n</ul>\n<p>与えられたモデルフィールドに対して使われるフォームフィールドをオーバーライドすることもできます。後述の <a class=\"reference internal\" href=\"#overriding-the-default-fields\">Overriding the default fields</a> を参照してください。</p>\n</section>\n<section id=\"a-full-example\">\n<h3>完全な具体例<a class=\"heading-anchor\" href=\"#a-full-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>以下のような一連のモデルを考えていきましょう:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<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\">ModelForm</span>\n\n<span class=\"n\">TITLE_CHOICES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;MR&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Mr.&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;MRS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Mrs.&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;MS&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Ms.&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Author</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"n\">TITLE_CHOICES</span><span class=\"p\">)</span>\n    <span class=\"n\">birth_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">(</span><span class=\"n\">blank</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">null</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">authors</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">]</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BookForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Book</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;authors&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>これらのモデルでは、上記の <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> サブクラスはおおむね以下と同等と言えます (唯一の違いは <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</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</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</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=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <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=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">,</span>\n        <span class=\"n\">widget</span><span class=\"o\">=</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Select</span><span class=\"p\">(</span><span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"n\">TITLE_CHOICES</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">birth_date</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">(</span><span class=\"n\">required</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BookForm</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=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">authors</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ModelMultipleChoiceField</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">())</span>\n</code></pre></div>\n</section>\n<section id=\"validation-on-a-modelform\">\n<span id=\"validation-on-modelform\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> の検証 (バリデーション)<a class=\"heading-anchor\" href=\"#validation-on-a-modelform\"><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\">ModelForm</span></code> のバリデーションには、以下の 2 つのステップが存在します:</p>\n<ol class=\"arabic simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/validation/\"><span class=\"doc\">フォームのバリデーションを実施する</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルのインスタンスのバリデーションを実施する</span></a></p></li>\n</ol>\n<p>通常のフォームのバリデーションと同じように、モデルフォームのバリデーションは <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/api/#django.forms.Form.is_valid\" title=\"django.forms.Form.is_valid\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">is_valid()</span></code></a> が呼ばれたときや <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/api/#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">errors</span></code></a> 属性にアクセスしたとき、暗黙的に実行されます。また、実際にはあまり使うメソッドではありませんが、明示的に <code class=\"docutils literal notranslate\"><span class=\"pre\">full_clean()</span></code> を呼んだときにもバリデーションが実行されます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Model</span></code> バリデーション (<a class=\"reference internal\" href=\"/ja/4.1/ref/models/instances/#django.db.models.Model.full_clean\" title=\"django.db.models.Model.full_clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.full_clean()</span></code></a>) は、フォームバリデーションのステップ内でフォームの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドが呼ばれたすぐ直後に実行されます。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>クリーニングのプロセスは、様々な方法で <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> コンストラクタに渡されたモデルのインスタンスを修正します。例えば、モデル上のあらゆる日付フィールドは、実際の date オブジェクトに変換されます。失敗したバリデーションは、一貫性のない状態でモデルインスタンスを元のままにしておくため、これを再利用するのはお勧めできません。</p>\n</aside>\n<section id=\"overriding-the-clean-method\">\n<span id=\"overriding-modelform-clean-method\"></span><h4>Overriding the <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> method<a class=\"heading-anchor\" href=\"#overriding-the-clean-method\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>通常のフォームと同じ方法でモデルフォーム上の <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドをオーバーライドして、バリデーションの動作を追加することができます。</p>\n<p>モデルのオブジェクトに付属したモデルフォームのインスタンスは、<code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code> 属性を持ち、メソッドが特定のモデルのインスタンスにアクセスできるようにします。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm.clean()</span></code> メソッドは、<a class=\"reference internal\" href=\"/ja/4.1/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルバリデーション</span></a> に、<code class=\"docutils literal notranslate\"><span class=\"pre\">unique</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_for_date|month|year</span></code> としてマークされたモデルフィールドの一意性を検証させます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドをオーバーライドして、なおかつこのバリデーションを維持したい場合、親クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドを呼ぶ必要があります。</p>\n</aside>\n</section>\n<section id=\"interaction-with-model-validation\">\n<h4>モデルバリデーションとのやり取り<a class=\"heading-anchor\" href=\"#interaction-with-model-validation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>バリデーションプロセスの一部として、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> フォーム上で対応するフィールドを持つモデルのそれぞれのフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドを呼び出します。モデルフィールドを除外した場合、これらのフィールドに対してはバリデーションが実行されません。フィールドのクリーニングとバリデーションの詳しい働き方については、<a class=\"reference internal\" href=\"/ja/4.1/ref/forms/validation/\"><span class=\"doc\">フォームバリデーション</span></a> ドキュメントを参照してください。</p>\n<p>モデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドは一意性のチェックがされる前に呼び出されます。モデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> フックのより詳しい情報については、<a class=\"reference internal\" href=\"/ja/4.1/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">オブジェクトのバリデーションを行う</span></a> を参照してください。</p>\n</section>\n<section id=\"considerations-regarding-model-s-error-messages\">\n<span id=\"considerations-regarding-model-errormessages\"></span><h4>モデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">error_messages</span></code> のレンダリングを考える<a class=\"heading-anchor\" href=\"#considerations-regarding-model-s-error-messages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/#django.forms.Field.error_messages\" title=\"django.forms.Field.error_messages\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">フォームフィールド</span></code></a> や <a class=\"reference internal\" href=\"#modelforms-overriding-default-fields\"><span class=\"std std-ref\">フォーム Meta</span></a> のレベルで定義されたエラーメッセージは、常に <a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.Field.error_messages\" title=\"django.db.models.Field.error_messages\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">モデルフィールド</span></code></a> のレベルで定義されたエラーメッセージより優先されます。</p>\n<p><a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.Field.error_messages\" title=\"django.db.models.Field.error_messages\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">モデルフィールド</span></code></a> で定義されたエラーメッセージは、<a class=\"reference internal\" href=\"/ja/4.1/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルバリデーション</span></a> のステップの間に <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> が発生したときに、対応するエラーメッセージがフォームのレベルで定義されていない場合にのみ使用されます。</p>\n<p><a class=\"reference internal\" href=\"/ja/4.1/ref/exceptions/#django.core.exceptions.NON_FIELD_ERRORS\" title=\"django.core.exceptions.NON_FIELD_ERRORS\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">NON_FIELD_ERRORS</span></code></a> キーを <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラス内の <code class=\"docutils literal notranslate\"><span class=\"pre\">error_messages</span></code> ディクショナリに追加することで、モデルバリデーションによって発生する <code class=\"docutils literal notranslate\"><span class=\"pre\">NON_FIELD_ERRORS</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.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">NON_FIELD_ERRORS</span>\n<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\">ModelForm</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">error_messages</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"n\">NON_FIELD_ERRORS</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n                <span class=\"s1\">&#39;unique_together&#39;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">%(model_name)s</span><span class=\"s2\">&#39;s </span><span class=\"si\">%(field_labels)s</span><span class=\"s2\"> are not unique.&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">}</span>\n        <span class=\"p\">}</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"the-save-method\">\n<span id=\"topics-modelform-save\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> メソッド<a class=\"heading-anchor\" href=\"#the-save-method\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Every <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> also has a <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> method. This method creates and saves\na database object from the data bound to the form. A subclass of <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code>\ncan accept an existing model instance as the keyword argument <code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code>; if\nthis is supplied, <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> will update that instance. If it's not supplied,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> will create a new instance of the specified model:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</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=\"go\"># Create a form instance from POST data.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Save a new Article object from the form&#39;s data.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">new_article</span> <span class=\"o\">=</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"go\"># Create a form to edit an existing Article, but use</span>\n<span class=\"go\"># POST data to populate the form.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</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\">f</span> <span class=\"o\">=</span> <span class=\"n\">ArticleForm</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\">instance</span><span class=\"o\">=</span><span class=\"n\">a</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>フォームが <a class=\"reference internal\" href=\"#validation-on-modelform\"><span class=\"std std-ref\">バリデーションされていない</span></a> 場合、<code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> を呼び出すと、<code class=\"docutils literal notranslate\"><span class=\"pre\">form.errors</span></code> をチェックすることでこれを行います。フォーム内のデータが適正ではない場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">ValueError</span></code> が発生します -- 例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">form.errors</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> だと評価された場合です。</p>\n<p>オプションのフィールドがフォームのデータに表示されない場合、結果のモデルインスタンスはモデルフィールドの <a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">default</span></code></a> を使用します。この動作は、 <a class=\"reference internal\" href=\"/ja/4.1/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>, <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/widgets/#django.forms.CheckboxSelectMultiple\" title=\"django.forms.CheckboxSelectMultiple\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CheckboxSelectMultiple</span></code></a>, または <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/widgets/#django.forms.SelectMultiple\" title=\"django.forms.SelectMultiple\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SelectMultiple</span></code></a> (または <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/widgets/#django.forms.Widget.value_omitted_from_data\" title=\"django.forms.Widget.value_omitted_from_data\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">value_omitted_from_data()</span></code></a> メソッドが常に <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> を返すカスタムウィジェット) を使用するフィールドには適用されません。チェックされていないチェックボックスと、選択されていない <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;select</span> <span class=\"pre\">multiple&gt;</span></code> は HTML フォーム送信のデータには表示されないからです。 API を設計していて、これらのウィジェットを使用するフィールドのデフォルトのフォールバック動作が必要な場合は、カスタムフォームフィールドまたはウィジェットを使用します。</p>\n<p>この <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> には、省略可能な <code class=\"docutils literal notranslate\"><span class=\"pre\">commit</span></code> キーワード引数があり、<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> ないし <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> を取ります。<code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> を <code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code> で呼び出した場合、データベースにまだ保存されていないオブジェクトを返します。この場合、結果のモデルインスタンスで <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> を呼び出すかどうかはあなた次第です。これは、保存前にオブジェクトで独自のプロセスを実行したい場合、もしくは特別な <a class=\"reference internal\" href=\"/ja/4.1/ref/models/instances/#ref-models-force-insert\"><span class=\"std std-ref\">モデル保存オプション</span></a> を使いたい場合に有用です。 <code class=\"docutils literal notranslate\"><span class=\"pre\">commit</span></code> はデフォルトでは <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> です。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code> を使う際のもう 1 つの副作用は、モデルに他のモデルとの多対多の関係がある場合に見られます。フォームを save するときにモデルに多対多の関係があり <code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code> を指定した場合、Django は多対多の関係に対してフォームのデータを即座に保存することができません。これは、インスタンスがデータベース上に存在するようになるまで、インスタンスに対して多対多のデータを保存することが不可能だからです。</p>\n<p>To work around this problem, every time you save a form using <code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code>,\nDjango adds a <code class=\"docutils literal notranslate\"><span class=\"pre\">save_m2m()</span></code> method to your <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> subclass. After\nyou've manually saved the instance produced by the form, you can invoke\n<code class=\"docutils literal notranslate\"><span class=\"pre\">save_m2m()</span></code> to save the many-to-many form data. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Create a form instance with POST data.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Create, but don&#39;t save the new author instance.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">new_author</span> <span class=\"o\">=</span> <span class=\"n\">f</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\n<span class=\"c1\"># Modify the author in some way.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">new_author</span><span class=\"o\">.</span><span class=\"n\">some_field</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;some_value&#39;</span>\n\n<span class=\"c1\"># Save the new instance.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">new_author</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Now, save the many-to-many data for the form.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">save_m2m</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Calling <code class=\"docutils literal notranslate\"><span class=\"pre\">save_m2m()</span></code> is only required if you use <code class=\"docutils literal notranslate\"><span class=\"pre\">save(commit=False)</span></code>.\nWhen you use a <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> on a form, all data -- including many-to-many data --\nis saved without the need for any additional method calls.  For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Create a form instance with POST data.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"p\">()</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">AuthorForm</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\">instance</span><span class=\"o\">=</span><span class=\"n\">a</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Create and save the new author instance. There&#39;s no need to do anything else.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">new_author</span> <span class=\"o\">=</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">save_m2m()</span></code> メソッドのほかは、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">forms</span></code> のフォームとまったく同じ方法で動作します。例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">is_valid()</span></code> メソッドは妥当性をチェックするために使用される、<code class=\"docutils literal notranslate\"><span class=\"pre\">is_multipart()</span></code> メソッドはフォームがマルチパートのファイルアップロードを必要とするかどうかを (ゆえに <code class=\"docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code> がフォームに渡される必要があるかどうかも) 決める、などです。詳しくは <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/api/#binding-uploaded-files\"><span class=\"std std-ref\">Binding uploaded files to a form</span></a> を参照してください。</p>\n</section>\n<section id=\"selecting-the-fields-to-use\">\n<span id=\"modelforms-selecting-fields\"></span><h3>使うフィールドを選択する<a class=\"heading-anchor\" href=\"#selecting-the-fields-to-use\"><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\">fields</span></code> 属性を使って、フォームで編集すべき全てのフィールドを明示的に指定することを強くお勧めします。そうしないと、フォームで予期せず特定のフィールドを設定できるようになり、セキュリティ上の問題が発生しやすくなります。特に新しいフィールドがモデルに追加されたときに起こりがちです。フォームのレンダリング方法によっては、Webページで問題が目に見えないことさえあります。</p>\n<p>The alternative approach would be to include all fields automatically, or\nremove only some. This fundamental approach is known to be much less secure\nand has led to serious exploits on major websites (e.g. <a class=\"reference external\" href=\"https://github.blog/2012-03-04-public-key-security-vulnerability-and-mitigation/\">GitHub</a>).</p>\n<p>しかしながら、これらのセキュリティ問題が当てはまらないことが明白な場合のために、2 つのショートカットが利用可能です:</p>\n<ol class=\"arabic\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> 属性に、特殊な値 <code class=\"docutils literal notranslate\"><span class=\"pre\">'__all__'</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\">ModelForm</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;__all__&#39;</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> の中の <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude</span></code> 属性に、フォームから除外されるフィールドのリストをセットします。</p>\n<p>例:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PartialAuthorForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n        <span class=\"n\">exclude</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;title&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> モデルは 3 つのフィールド <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">birth_date</span></code> を持っているため、これで <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">birth_date</span></code> がフォームに表示されることになります。</p>\n</li>\n</ol>\n<p>このどちらかが使われた場合、フォーム内で表示されるフィールドの順番はモデル内でフィールドが定義された順番となり、<code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> インスタンスは最後に表示されます。</p>\n<p>加えて、Django は以下のルールも適用します: モデルフィールドで <code class=\"docutils literal notranslate\"><span class=\"pre\">editable=False</span></code> をセットした場合、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> を通じて生成された <em>全ての</em> フォームはそのフィールドを含みません。</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\">save()</span></code> メソッドでセットされません。また、除外したフィールドを手動でフォームに追加し直した場合、モデルインスタンスから初期化されることはありません。</p>\n<p>Django は不完全なモデルを保存しないようにするため、モデルの設定でフィールドを空にすることを許容しておらず、かつ除外されたフィールドに対するデフォルト値を指定しなかった場合、除外されたフィールドを含む <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> を <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</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=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s1\">&#39;Mr&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">PartialAuthorForm</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\">instance</span><span class=\"o\">=</span><span class=\"n\">author</span><span class=\"p\">)</span>\n<span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>もしくは、<code class=\"docutils literal notranslate\"><span class=\"pre\">save(commit=False)</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=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">PartialAuthorForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">)</span>\n<span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">form</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=\"n\">author</span><span class=\"o\">.</span><span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Mr&#39;</span>\n<span class=\"n\">author</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">save(commit=False)</span></code> の使用について、詳しくは <a class=\"reference internal\" href=\"#the-save-method\">section on saving forms</a> を参照してください。</p>\n</aside>\n</section>\n<section id=\"overriding-the-default-fields\">\n<span id=\"modelforms-overriding-default-fields\"></span><h3>デフォルトのフィールドをオーバライドする<a class=\"heading-anchor\" href=\"#overriding-the-default-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>前述の <a class=\"reference internal\" href=\"#field-types\">Field types</a> テーブルで説明したとおり、デフォルトのフィールドタイプは実用的なデフォルトです。モデルに <code class=\"docutils literal notranslate\"><span class=\"pre\">DateField</span></code> がある場合、フォーム内で <code class=\"docutils literal notranslate\"><span class=\"pre\">DateField</span></code> として表示したいことでしょう。しかし、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> では、与えられたモデルに足してフォームフィールドを変更する柔軟性があります。</p>\n<p>フィールドに対して独自のウィジェットを指定するには、内部の <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> を使用してください。これは、フィールド名としジェットのクラスやインスタンスをマッピングするディクショナリです。</p>\n<p>例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">Authoer</span></code> の <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> 属性に対する <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code> を、デフォルトの <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;input</span> <span class=\"pre\">type=&quot;text&quot;&gt;</span></code> の代わりに <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;textarea&gt;</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\">ModelForm</span><span class=\"p\">,</span> <span class=\"n\">Textarea</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">)</span>\n        <span class=\"n\">widgets</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"n\">Textarea</span><span class=\"p\">(</span><span class=\"n\">attrs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;cols&#39;</span><span class=\"p\">:</span> <span class=\"mi\">80</span><span class=\"p\">,</span> <span class=\"s1\">&#39;rows&#39;</span><span class=\"p\">:</span> <span class=\"mi\">20</span><span class=\"p\">}),</span>\n        <span class=\"p\">}</span>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> dictionary accepts either widget instances (e.g.,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Textarea(...)</span></code>) or classes (e.g., <code class=\"docutils literal notranslate\"><span class=\"pre\">Textarea</span></code>). Note that the <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code>\ndictionary is ignored for a model field with a non-empty <code class=\"docutils literal notranslate\"><span class=\"pre\">choices</span></code> attribute.\nIn this case, you must override the form field to use a different widget.</p>\n<p>同様に、フィールドをさらにカスタマイズしたい場合、内部の <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">labels</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">help_texts</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">error_messages</span></code> と言った属性を指定することができます。</p>\n<p>例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">name</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.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">)</span>\n        <span class=\"n\">labels</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Writer&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">}</span>\n        <span class=\"n\">help_texts</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Some useful help text.&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">}</span>\n        <span class=\"n\">error_messages</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n                <span class=\"s1\">&#39;max_length&#39;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;This writer&#39;s name is too long.&quot;</span><span class=\"p\">),</span>\n            <span class=\"p\">},</span>\n        <span class=\"p\">}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">field_classes</span></code> を指定して、フォームによってインスタンス化されたフィールドのタイプをカスタマイズすることもできます。</p>\n<p>例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">slug</span></code> フィールドに対して <code class=\"docutils literal notranslate\"><span class=\"pre\">MySlugFormField</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\">ModelForm</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Article</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;content&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;reporter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;slug&#39;</span><span class=\"p\">]</span>\n        <span class=\"n\">field_classes</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;slug&#39;</span><span class=\"p\">:</span> <span class=\"n\">MySlugFormField</span><span class=\"p\">,</span>\n        <span class=\"p\">}</span>\n</code></pre></div>\n<p>最後に、フィールドを完全に -- タイプ、バリデータ、必須かどうかなどを含めて -- コントロールしたい場合、通常の <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> で行うのと同じようにフィールドを宣言的に指定することで実現できます。</p>\n<p>フィールドのバリデータを指定したい場合、フィールドを宣言的に定義して <code class=\"docutils literal notranslate\"><span class=\"pre\">validators</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\">CharField</span><span class=\"p\">,</span> <span class=\"n\">ModelForm</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"n\">slug</span> <span class=\"o\">=</span> <span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">validators</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">validate_slug</span><span class=\"p\">])</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Article</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;pub_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;content&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;reporter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;slug&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>以下のように明示的にフォームフィールドをインスタンス化したとき、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> と 通常の <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> が連動する方法を理解することが重要となります。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> は、特定のフィールドを自動的に生成できる通常の <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> です。自動的に生成されるフィールドは、<code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの内容とどのフィールドが宣言的に定義されているかに依存します。基本的に、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> は フォームから <strong>除外された</strong> フィールド、言い換えると宣言的に定義されなかったフィールド <strong>のみ</strong> を生成します。</p>\n<p>宣言的に定義されたフィールドはそのままになります。したがって、<code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> 属性に対するカスタマイズ、例えば <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">labels</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">help_texts</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">error_messages</span></code> は無視されます; これらは自動的に生成されたフィールドにのみ適用されます。</p>\n<p>同様に、宣言的に定義されたフィールドは、対応するモデルから引き継がれた <code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">required</span></code> のような属性を描画しません。モデル内で定義された動作を引き継ぎたい場合は、フォームフィールドを宣言する際に明示的に関連する属性をセットする必要があります。</p>\n<p>例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">Article</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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span>\n        <span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">,</span>\n        <span class=\"n\">null</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"n\">blank</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"n\">help_text</span><span class=\"o\">=</span><span class=\"s1\">&#39;Use puns liberally&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">content</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>そして、指定されたとおりに <code class=\"docutils literal notranslate\"><span class=\"pre\">blank</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">help_text</span></code> が維持されている一方で、<code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code> に対して独自のバリデーションを実施するために、<code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleForm</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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"n\">MyFormField</span><span class=\"p\">(</span>\n        <span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">,</span>\n        <span class=\"n\">required</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"n\">help_text</span><span class=\"o\">=</span><span class=\"s1\">&#39;Use puns liberally&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Article</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;content&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>フォームフィールドのタイプを使用して、対応するモデルフィールドの内容を設定できることを確認する必要があります。 互換性がない場合、暗黙的な変換が行われないので、 &quot;ValueError&quot; を取得します。</p>\n<p>フィールドとその属性について、詳しくは <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/fields/\"><span class=\"doc\">フォームフィールドのドキュメンテーション</span></a> を参照してください。</p>\n</aside>\n</section>\n<section id=\"enabling-localization-of-fields\">\n<h3>フィールドのローカル化を有効にする<a class=\"heading-anchor\" href=\"#enabling-localization-of-fields\"><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\">ModelForm</span></code> 内のフィールドはデータをローカル化しません。フィールドに対してローカル化を有効にするために、<code class=\"docutils literal notranslate\"><span class=\"pre\">Meat</span></code> クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</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=\"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\">ModelForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n<span class=\"gp\">... </span>        <span class=\"n\">localized_fields</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">,)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code> が特殊な値 <code class=\"docutils literal notranslate\"><span class=\"pre\">'__all__'</span></code> にセットされた場合、全てのフィールドがローカル化されます。</p>\n</section>\n<section id=\"form-inheritance\">\n<h3>フォームの継承<a class=\"heading-anchor\" href=\"#form-inheritance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As with basic forms, you can extend and reuse <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForms</span></code> by inheriting\nthem. This is useful if you need to declare extra fields or extra methods on a\nparent class for use in a number of forms derived from models. For example,\nusing the previous <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleForm</span></code> class:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">EnhancedArticleForm</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=\"nf\">clean_pub_date</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>        <span class=\"o\">...</span>\n</code></pre></div>\n<p>This creates a form that behaves identically to <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleForm</span></code>, except there's\nsome extra validation and cleaning for the <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> field.</p>\n<p>You can also subclass the parent's <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> inner class if you want to change\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.fields</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.exclude</span></code> lists:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">RestrictedArticleForm</span><span class=\"p\">(</span><span class=\"n\">EnhancedArticleForm</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"o\">.</span><span class=\"n\">Meta</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>        <span class=\"n\">exclude</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;body&#39;</span><span class=\"p\">,)</span>\n</code></pre></div>\n<p>This adds the extra method from the <code class=\"docutils literal notranslate\"><span class=\"pre\">EnhancedArticleForm</span></code> and modifies\nthe original <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleForm.Meta</span></code> to remove one field.</p>\n<p>There are a couple of things to note, however.</p>\n<ul>\n<li><p>Normal Python name resolution rules apply. If you have multiple base\nclasses that declare a <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> inner class, only the first one will be\nused. This means the child's <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code>, if it exists, otherwise the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> of the first parent, etc.</p></li>\n<li><p>It's possible to inherit from both <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> simultaneously,\nhowever, you must ensure that <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> appears first in the MRO. This is\nbecause these classes rely on different metaclasses and a class can only have\none metaclass.</p></li>\n<li><p>It's possible to declaratively remove a <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> inherited from a parent class by\nsetting the name to be <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> on the subclass.</p>\n<p>You can only use this technique to opt out from a field defined declaratively\nby a parent class; it won't prevent the <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> metaclass from generating\na default field. To opt-out from default fields, see\n<a class=\"reference internal\" href=\"#modelforms-selecting-fields\"><span class=\"std std-ref\">使うフィールドを選択する</span></a>.</p>\n</li>\n</ul>\n</section>\n<section id=\"providing-initial-values\">\n<h3>Providing initial values<a class=\"heading-anchor\" href=\"#providing-initial-values\"><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\">initial</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">article</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</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\">article</span><span class=\"o\">.</span><span class=\"n\">headline</span>\n<span class=\"go\">&#39;My headline&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Initial headline&#39;</span><span class=\"p\">},</span> <span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">article</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">form</span><span class=\"p\">[</span><span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">()</span>\n<span class=\"go\">&#39;Initial headline&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"modelform-factory-function\">\n<span id=\"modelforms-factory\"></span><h3>ModelForm factory 関数<a class=\"heading-anchor\" href=\"#modelform-factory-function\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>クラスの定義を使用する代わりに、スタンドアロンの関数 <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/models/#django.forms.models.modelform_factory\" title=\"django.forms.models.modelform_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelform_factory()</span></code></a> を使って、与えられたモデルからフォームを生成することができます。作成時にカスタマイズをたくさん行わない場合に便利です:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"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\">modelform_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Book</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">BookForm</span> <span class=\"o\">=</span> <span class=\"n\">modelform_factory</span><span class=\"p\">(</span><span class=\"n\">Book</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>This can also be used to make modifications to existing forms, for example by\nspecifying the widgets to be used for a given field:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Textarea</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Form</span> <span class=\"o\">=</span> <span class=\"n\">modelform_factory</span><span class=\"p\">(</span><span class=\"n\">Book</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"o\">=</span><span class=\"n\">BookForm</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>                         <span class=\"n\">widgets</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> <span class=\"n\">Textarea</span><span class=\"p\">()})</span>\n</code></pre></div>\n<p>含むフィールドは <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude</span></code> のキーワード引数、もしくは <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> 内部の <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの対応する属性を使って指定できます。<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> <a class=\"reference internal\" href=\"#modelforms-selecting-fields\"><span class=\"std std-ref\">使うフィールドを選択する</span></a> ドキュメントを参照してください。</p>\n<p>... もしくは、特定のフィールドに対してローカル化を有効にします:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Form</span> <span class=\"o\">=</span> <span class=\"n\">modelform_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"o\">=</span><span class=\"n\">AuthorForm</span><span class=\"p\">,</span> <span class=\"n\">localized_fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;birth_date&quot;</span><span class=\"p\">,))</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"model-formsets\">\n<span id=\"id1\"></span><h2>モデルのフォームセット<a class=\"heading-anchor\" href=\"#model-formsets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">BaseModelFormSet</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Like <a class=\"reference internal\" href=\"/ja/4.1/topics/forms/formsets/\"><span class=\"doc\">regular formsets</span></a>, Django provides a couple\nof enhanced formset classes to make working with Django models more\nconvenient. Let's reuse the <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> model from above:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">modelformset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> を使用すると、フォームセットが与えられるフィールドだけを使うようになります。 もしくは、&quot;オプトアウト&quot; の方法 (除外するフィールドを指定する) を取ることもできます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">exclude</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">,))</span>\n</code></pre></div>\n<p>以下は、<code class=\"docutils literal notranslate\"><span class=\"pre\">Author</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">formset</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;input type=&quot;hidden&quot; name=&quot;form-TOTAL_FORMS&quot; value=&quot;1&quot; id=&quot;id_form-TOTAL_FORMS&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;form-INITIAL_FORMS&quot; value=&quot;0&quot; id=&quot;id_form-INITIAL_FORMS&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;form-MIN_NUM_FORMS&quot; value=&quot;0&quot; id=&quot;id_form-MIN_NUM_FORMS&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;form-MAX_NUM_FORMS&quot; value=&quot;1000&quot; id=&quot;id_form-MAX_NUM_FORMS&quot;&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_form-0-name&quot;&gt;Name:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_form-0-name&quot; type=&quot;text&quot; name=&quot;form-0-name&quot; maxlength=&quot;100&quot;&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_form-0-title&quot;&gt;Title:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;select name=&quot;form-0-title&quot; id=&quot;id_form-0-title&quot;&gt;</span>\n<span class=\"go\">&lt;option value=&quot;&quot; selected&gt;---------&lt;/option&gt;</span>\n<span class=\"go\">&lt;option value=&quot;MR&quot;&gt;Mr.&lt;/option&gt;</span>\n<span class=\"go\">&lt;option value=&quot;MRS&quot;&gt;Mrs.&lt;/option&gt;</span>\n<span class=\"go\">&lt;option value=&quot;MS&quot;&gt;Ms.&lt;/option&gt;</span>\n<span class=\"go\">&lt;/select&gt;&lt;input type=&quot;hidden&quot; name=&quot;form-0-id&quot; id=&quot;id_form-0-id&quot;&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelformset_factory()</span></code></a> uses\n<a class=\"reference internal\" href=\"/ja/4.1/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> to generate formsets. This\nmeans that a model formset is an extension of a basic formset that knows\nhow to interact with a particular model.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>When using <a class=\"reference internal\" href=\"/ja/4.1/topics/db/models/#multi-table-inheritance\"><span class=\"std std-ref\">multi-table inheritance</span></a>, forms\ngenerated by a formset factory will contain a parent link field (by default\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;parent_model_name&gt;_ptr</span></code>) instead of an <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> field.</p>\n</aside>\n<section id=\"changing-the-queryset\">\n<h3>クエリセットを変更する<a class=\"heading-anchor\" href=\"#changing-the-queryset\"><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\">Author.objects.all()</span></code>) を使用します。 <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;O&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>もしくは、<code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> の中で <code class=\"docutils literal notranslate\"><span class=\"pre\">self.queryset</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\">BaseModelFormSet</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BaseAuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseModelFormSet</span><span class=\"p\">):</span>\n    <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=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><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=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">queryset</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;O&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>そして、<code class=\"docutils literal notranslate\"><span class=\"pre\">BaseAuthorFormSet</span></code> クラスを factory 関数に渡します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">),</span> <span class=\"n\">formset</span><span class=\"o\">=</span><span class=\"n\">BaseAuthorFormSet</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>If you want to return a formset that doesn't include <em>any</em> preexisting\ninstances of the model, you can specify an empty QuerySet:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">none</span><span class=\"p\">())</span>\n</code></pre></div>\n</section>\n<section id=\"changing-the-form\">\n<h3>フォームを変更する<a class=\"heading-anchor\" href=\"#changing-the-form\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>By default, when you use <code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code>, a model form will\nbe created using <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/models/#django.forms.models.modelform_factory\" title=\"django.forms.models.modelform_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelform_factory()</span></code></a>.\nOften, it can be useful to specify a custom model form. For example,\nyou can create a custom model form that has custom validation:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># custom validation for the name field</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<p>Then, pass your model form to the factory function:</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=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"o\">=</span><span class=\"n\">AuthorForm</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>It is not always necessary to define a custom model form. The\n<code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code> function has several arguments which are\npassed through to <code class=\"docutils literal notranslate\"><span class=\"pre\">modelform_factory</span></code>, which are described below.</p>\n</section>\n<section id=\"specifying-widgets-to-use-in-the-form-with-widgets\">\n<h3>Specifying widgets to use in the form with <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code><a class=\"heading-anchor\" href=\"#specifying-widgets-to-use-in-the-form-with-widgets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Using the <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> parameter, you can specify a dictionary of values to\ncustomize the <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code>’s widget class for a particular field. This\nworks the same way as the <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> dictionary on the inner <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code>\nclass of a <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> works:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">widgets</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"n\">Textarea</span><span class=\"p\">(</span><span class=\"n\">attrs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;cols&#39;</span><span class=\"p\">:</span> <span class=\"mi\">80</span><span class=\"p\">,</span> <span class=\"s1\">&#39;rows&#39;</span><span class=\"p\">:</span> <span class=\"mi\">20</span><span class=\"p\">})})</span>\n</code></pre></div>\n</section>\n<section id=\"enabling-localization-for-fields-with-localized-fields\">\n<h3>Enabling localization for fields with <code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code><a class=\"heading-anchor\" href=\"#enabling-localization-for-fields-with-localized-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Using the <code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code> parameter, you can enable localization for\nfields in the form.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">localized_fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">,))</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code> が特殊な値 <code class=\"docutils literal notranslate\"><span class=\"pre\">'__all__'</span></code> にセットされた場合、全てのフィールドがローカル化されます。</p>\n</section>\n<section id=\"id2\">\n<h3>Providing initial values<a class=\"heading-anchor\" href=\"#id2\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As with regular formsets, it's possible to <a class=\"reference internal\" href=\"/ja/4.1/topics/forms/formsets/#formsets-initial-data\"><span class=\"std std-ref\">specify initial data</span></a> for forms in the formset by specifying an <code class=\"docutils literal notranslate\"><span class=\"pre\">initial</span></code>\nparameter when instantiating the model formset class returned by\n<a class=\"reference internal\" href=\"/ja/4.1/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelformset_factory()</span></code></a>. However, with model\nformsets, the initial values only apply to extra forms, those that aren't\nattached to an existing model instance. If the length of <code class=\"docutils literal notranslate\"><span class=\"pre\">initial</span></code> exceeds\nthe number of extra forms, the excess initial data is ignored. If the extra\nforms with initial data aren't changed by the user, they won't be validated or\nsaved.</p>\n</section>\n<section id=\"saving-objects-in-the-formset\">\n<span id=\"id3\"></span><h3>Saving objects in the formset<a class=\"heading-anchor\" href=\"#saving-objects-in-the-formset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As with a <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code>, you can save the data as a model object. This is done\nwith the formset's <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> method:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Create a formset instance with POST data.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Assuming all is valid, save the data.</span>\n<span class=\"o\">&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>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> method returns the instances that have been saved to the\ndatabase. If a given instance's data didn't change in the bound data, the\ninstance won't be saved to the database and won't be included in the return\nvalue (<code class=\"docutils literal notranslate\"><span class=\"pre\">instances</span></code>, in the above example).</p>\n<p>When fields are missing from the form (for example because they have been\nexcluded), these fields will not be set by the <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> method. You can find\nmore information about this restriction, which also holds for regular\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForms</span></code>, in <a class=\"reference internal\" href=\"#selecting-the-fields-to-use\">Selecting the fields to use</a>.</p>\n<p>Pass <code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code> to return the unsaved model instances:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># don&#39;t save to the database</span>\n<span class=\"o\">&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=\"o\">&gt;&gt;&gt;</span> <span class=\"k\">for</span> <span class=\"n\">instance</span> <span class=\"ow\">in</span> <span class=\"n\">instances</span><span class=\"p\">:</span>\n<span class=\"o\">...</span>     <span class=\"c1\"># do something with instance</span>\n<span class=\"o\">...</span>     <span class=\"n\">instance</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>This gives you the ability to attach data to the instances before saving them\nto the database. If your formset contains a <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code>, you'll also\nneed to call <code class=\"docutils literal notranslate\"><span class=\"pre\">formset.save_m2m()</span></code> to ensure the many-to-many relationships\nare saved properly.</p>\n<p>After calling <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code>, your model formset will have three new attributes\ncontaining the formset's changes:</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet.changed_objects\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">models.BaseModelFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">changed_objects</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet.changed_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet.deleted_objects\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">models.BaseModelFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">deleted_objects</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet.deleted_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet.new_objects\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">models.BaseModelFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">new_objects</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet.new_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</section>\n<section id=\"limiting-the-number-of-editable-objects\">\n<span id=\"model-formsets-max-num\"></span><h3>Limiting the number of editable objects<a class=\"heading-anchor\" href=\"#limiting-the-number-of-editable-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As with regular formsets, you can use the <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> parameters\nto <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelformset_factory()</span></code></a> to limit the number of\nextra forms displayed.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> does not prevent existing objects from being displayed:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Author: Charles Baudelaire&gt;, &lt;Author: Paul Verlaine&gt;, &lt;Author: Walt Whitman&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</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\">AuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"p\">[</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()]</span>\n<span class=\"go\">[&#39;Charles Baudelaire&#39;, &#39;Paul Verlaine&#39;, &#39;Walt Whitman&#39;]</span>\n</code></pre></div>\n<p>Also, <code class=\"docutils literal notranslate\"><span class=\"pre\">extra=0</span></code> doesn't prevent creation of new model instances as you can\n<a class=\"reference internal\" href=\"/ja/4.1/topics/forms/formsets/#understanding-the-managementform\"><span class=\"std std-ref\">add additional forms with JavaScript</span></a>\nor send additional POST data. See <a class=\"reference internal\" href=\"#model-formsets-edit-only\"><span class=\"std std-ref\">Preventing new objects creation</span></a> on how to do\nthis.</p>\n<p>If the value of <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> is greater than the number of existing related\nobjects, up to <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> additional blank forms will be added to the formset,\nso long as the total number of forms does not exceed <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,),</span> <span class=\"n\">max_num</span><span class=\"o\">=</span><span class=\"mi\">4</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\">AuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</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=\"o\">.</span><span class=\"n\">as_table</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_form-0-name&quot;&gt;Name:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_form-0-name&quot; type=&quot;text&quot; name=&quot;form-0-name&quot; value=&quot;Charles Baudelaire&quot; maxlength=&quot;100&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;form-0-id&quot; value=&quot;1&quot; id=&quot;id_form-0-id&quot;&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_form-1-name&quot;&gt;Name:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_form-1-name&quot; type=&quot;text&quot; name=&quot;form-1-name&quot; value=&quot;Paul Verlaine&quot; maxlength=&quot;100&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;form-1-id&quot; value=&quot;3&quot; id=&quot;id_form-1-id&quot;&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_form-2-name&quot;&gt;Name:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_form-2-name&quot; type=&quot;text&quot; name=&quot;form-2-name&quot; value=&quot;Walt Whitman&quot; maxlength=&quot;100&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;form-2-id&quot; value=&quot;2&quot; id=&quot;id_form-2-id&quot;&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_form-3-name&quot;&gt;Name:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_form-3-name&quot; type=&quot;text&quot; name=&quot;form-3-name&quot; maxlength=&quot;100&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;form-3-id&quot; id=&quot;id_form-3-id&quot;&gt;&lt;/td&gt;&lt;/tr&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\">None</span></code> (デフォルト) だった場合、表示されるフォームの上限は大きな数になります (1000)。この数は、実際には制限がないと見なせるでしょう。</p>\n</section>\n<section id=\"preventing-new-objects-creation\">\n<span id=\"model-formsets-edit-only\"></span><h3>Preventing new objects creation<a class=\"heading-anchor\" href=\"#preventing-new-objects-creation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"4.1\">\n<p class=\"version-note-title\">New in Django 4.1</p></aside>\n<p>Using the <code class=\"docutils literal notranslate\"><span class=\"pre\">edit_only</span></code> parameter, you can prevent creation of any new\nobjects:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Author</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">edit_only</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Here, the formset will only edit existing <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> instances. No other\nobjects will be created or edited.</p>\n</section>\n<section id=\"using-a-model-formset-in-a-view\">\n<h3>Using a model formset in a view<a class=\"heading-anchor\" href=\"#using-a-model-formset-in-a-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Model formsets are very similar to formsets. Let's say we want to present a\nformset to edit <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> model instances:</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\">modelformset_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.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">manage_authors</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</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=\"s1\">&#39;POST&#39;</span><span class=\"p\">:</span>\n        <span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</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=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n            <span class=\"c1\"># do something.</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</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=\"s1\">&#39;manage_authors.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;formset&#39;</span><span class=\"p\">:</span> <span class=\"n\">formset</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>As you can see, the view logic of a model formset isn't drastically different\nthan that of a &quot;normal&quot; formset. The only difference is that we call\n<code class=\"docutils literal notranslate\"><span class=\"pre\">formset.save()</span></code> to save the data into the database. (This was described\nabove, in <a class=\"reference internal\" href=\"#saving-objects-in-the-formset\"><span class=\"std std-ref\">Saving objects in the formset</span></a>.)</p>\n</section>\n<section id=\"overriding-clean-on-a-modelformset\">\n<span id=\"model-formsets-overriding-clean\"></span><h3>Overriding <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> on a <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelFormSet</span></code><a class=\"heading-anchor\" href=\"#overriding-clean-on-a-modelformset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Just like with <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForms</span></code>, by default the <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> method of a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelFormSet</span></code> will validate that none of the items in the formset violate\nthe unique constraints on your model (either <code class=\"docutils literal notranslate\"><span class=\"pre\">unique</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> or\n<code class=\"docutils literal notranslate\"><span class=\"pre\">unique_for_date|month|year</span></code>).  If you want to override the <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> method\non a <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelFormSet</span></code> and maintain this validation, you must call the parent\nclass's <code class=\"docutils literal notranslate\"><span class=\"pre\">clean</span></code> method:</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\">BaseModelFormSet</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModelFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseModelFormSet</span><span class=\"p\">):</span>\n    <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=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">clean</span><span class=\"p\">()</span>\n        <span class=\"c1\"># example custom validation across forms in the formset</span>\n        <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=\"c1\"># your custom formset validation</span>\n            <span class=\"o\">...</span>\n</code></pre></div>\n<p>Also note that by the time you reach this step, individual model instances\nhave already been created for each <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code>. Modifying a value in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">form.cleaned_data</span></code> is not sufficient to affect the saved value. If you wish\nto modify a value in <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelFormSet.clean()</span></code> you must modify\n<code class=\"docutils literal notranslate\"><span class=\"pre\">form.instance</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\">BaseModelFormSet</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModelFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseModelFormSet</span><span class=\"p\">):</span>\n    <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=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">clean</span><span class=\"p\">()</span>\n\n        <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=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span><span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()</span>\n            <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span><span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">name</span>\n            <span class=\"c1\"># update the instance value.</span>\n            <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">instance</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">name</span>\n</code></pre></div>\n</section>\n<section id=\"using-a-custom-queryset\">\n<h3>Using a custom queryset<a class=\"heading-anchor\" href=\"#using-a-custom-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As stated earlier, you can override the default queryset used by the model\nformset:</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\">modelformset_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.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">manage_authors</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">))</span>\n    <span class=\"n\">queryset</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;O&#39;</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\">AuthorFormSet</span><span class=\"p\">(</span>\n            <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=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">queryset</span><span class=\"p\">,</span>\n        <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=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n            <span class=\"c1\"># Do something.</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">queryset</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=\"s1\">&#39;manage_authors.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;formset&#39;</span><span class=\"p\">:</span> <span class=\"n\">formset</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>Note that we pass the <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset</span></code> argument in both the <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code>\ncases in this example.</p>\n</section>\n<section id=\"using-the-formset-in-the-template\">\n<h3>Using the formset in the template<a class=\"heading-anchor\" href=\"#using-the-formset-in-the-template\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>There are three ways to render a formset in a Django template.</p>\n<p>First, you can let the formset do most of the work:</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</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>Second, you can manually render the formset, but let the form deal with\nitself:</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=\"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\">form</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>When you manually render the forms yourself, be sure to render the management\nform as shown above. See the <a class=\"reference internal\" href=\"/ja/4.1/topics/forms/formsets/#understanding-the-managementform\"><span class=\"std std-ref\">management form documentation</span></a>.</p>\n<p>Third, you can manually render each field:</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=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">field</span> <span class=\"k\">in</span> <span class=\"nv\">form</span> <span class=\"cp\">%}</span>\n            <span class=\"cp\">{{</span> <span class=\"nv\">field.label_tag</span> <span class=\"cp\">}}</span> <span class=\"cp\">{{</span> <span class=\"nv\">field</span> <span class=\"cp\">}}</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">endfor</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\">form</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>If you opt to use this third method and you don't iterate over the fields with\na <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">for</span> <span class=\"pre\">%}</span></code> loop, you'll need to render the primary key field. For example,\nif you were rendering the <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">age</span></code> fields of a model:</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=\"cp\">{{</span> <span class=\"nv\">form.id</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.name</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.age</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\">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>Notice how we need to explicitly render <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">form.id</span> <span class=\"pre\">}}</span></code>. This ensures that\nthe model formset, in the <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> case, will work correctly. (This example\nassumes a primary key named <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code>. If you've explicitly defined your own\nprimary key that isn't called <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code>, make sure it gets rendered.)</p>\n</section>\n</section>\n<section id=\"inline-formsets\">\n<span id=\"id4\"></span><h2>インラインフォームセット<a class=\"heading-anchor\" href=\"#inline-formsets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseInlineFormSet\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">BaseInlineFormSet</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseInlineFormSet\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>インラインフォームセットは、モデルフォームセット上の小さな抽象化レイヤーです。これを使うと、外部キーで関連するオブジェクトを操作することが簡単になります。以下の 2 つのモデルがあるとします:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Author</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>ある作者 (Author) に紐付いた本 (Book) を編集するフォームセットを作成するには、以下のようにします:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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\">inlineformset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">BookFormSet</span> <span class=\"o\">=</span> <span class=\"n\">inlineformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">Book</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;title&#39;</span><span class=\"p\">,))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Mike Royko&#39;</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\">BookFormSet</span><span class=\"p\">(</span><span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">author</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">BookFormSet</span></code>'s <a class=\"reference internal\" href=\"/ja/4.1/topics/forms/formsets/#formset-prefix\"><span class=\"std std-ref\">prefix</span></a> is <code class=\"docutils literal notranslate\"><span class=\"pre\">'book_set'</span></code>\n(<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;model</span> <span class=\"pre\">name&gt;_set</span></code> ). If <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code>'s <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> to <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> has a\n<a class=\"reference internal\" href=\"/ja/4.1/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">related_name</span></code></a>, that's used instead.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><a class=\"reference internal\" href=\"/ja/4.1/ref/forms/models/#django.forms.models.inlineformset_factory\" title=\"django.forms.models.inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">inlineformset_factory()</span></code></a> は、 <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelformset_factory()</span></code></a> を使い、<code class=\"docutils literal notranslate\"><span class=\"pre\">can_delete=True</span></code> をセットします。</p>\n</aside>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">参考</p>\n<p><a class=\"reference internal\" href=\"/ja/4.1/topics/forms/formsets/#manually-rendered-can-delete-and-can-order\"><span class=\"std std-ref\">手動でレンダリングされた can_delete と can_order</span></a>.</p>\n</aside>\n<section id=\"overriding-methods-on-an-inlineformset\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">InlineFormSet</span></code> のメソッドをオーバーライドする<a class=\"heading-anchor\" href=\"#overriding-methods-on-an-inlineformset\"><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\">InlineFormSet</span></code> のメソッドをオーバーライドするには、 <a class=\"reference internal\" href=\"#django.forms.models.BaseModelFormSet\" title=\"django.forms.models.BaseModelFormSet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseModelFormSet</span></code></a> ではなく、 <a class=\"reference internal\" href=\"#django.forms.models.BaseInlineFormSet\" title=\"django.forms.models.BaseInlineFormSet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseInlineFormSet</span></code></a> をサブクラス化します。</p>\n<p>例えば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> をオーバーライドするとします:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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\">BaseInlineFormSet</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomInlineFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseInlineFormSet</span><span class=\"p\">):</span>\n    <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=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">clean</span><span class=\"p\">()</span>\n        <span class=\"c1\"># example custom validation across forms in the formset</span>\n        <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=\"c1\"># your custom formset validation</span>\n            <span class=\"o\">...</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#model-formsets-overriding-clean\"><span class=\"std std-ref\">Overriding clean() on a ModelFormSet</span></a> も参照してください。</p>\n<p>そして、インラインフォームセットを生成するとき、省略可能な引数の <code class=\"docutils literal notranslate\"><span class=\"pre\">formset</span></code> で渡します:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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\">inlineformset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">BookFormSet</span> <span class=\"o\">=</span> <span class=\"n\">inlineformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">Book</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;title&#39;</span><span class=\"p\">,),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">formset</span><span class=\"o\">=</span><span class=\"n\">CustomInlineFormSet</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Mike Royko&#39;</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\">BookFormSet</span><span class=\"p\">(</span><span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">author</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"more-than-one-foreign-key-to-the-same-model\">\n<h3>複数の外部キーをひとつのモデルが持っている場合<a class=\"heading-anchor\" href=\"#more-than-one-foreign-key-to-the-same-model\"><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\">fk_name</span></code> を使い手動で曖昧さを解消しなければなりません。例として、次のモデルについて考えます:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Friendship</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">from_friend</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">Friend</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">,</span>\n        <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;from_friends&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">to_friend</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">Friend</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">,</span>\n        <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;friends&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">length_in_months</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>これを解決するには、  <code class=\"docutils literal notranslate\"><span class=\"pre\">fk_name</span></code> を  <a class=\"reference internal\" href=\"/ja/4.1/ref/forms/models/#django.forms.models.inlineformset_factory\" title=\"django.forms.models.inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">inlineformset_factory()</span></code></a> に使います:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">FriendshipFormSet</span> <span class=\"o\">=</span> <span class=\"n\">inlineformset_factory</span><span class=\"p\">(</span><span class=\"n\">Friend</span><span class=\"p\">,</span> <span class=\"n\">Friendship</span><span class=\"p\">,</span> <span class=\"n\">fk_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;from_friend&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;to_friend&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;length_in_months&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n<section id=\"using-an-inline-formset-in-a-view\">\n<h3>ビューでインラインフォームセットを使う<a class=\"heading-anchor\" href=\"#using-an-inline-formset-in-a-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>モデルに紐付いたオブジェクトを編集する機能をユーザーに提供するビューを作るには、こうします:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">manage_books</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">author_id</span><span class=\"p\">):</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">author_id</span><span class=\"p\">)</span>\n    <span class=\"n\">BookInlineFormSet</span> <span class=\"o\">=</span> <span class=\"n\">inlineformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">Book</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;title&#39;</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\">BookInlineFormSet</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\">instance</span><span class=\"o\">=</span><span class=\"n\">author</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=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n            <span class=\"c1\"># Do something. Should generally end with a redirect. For example:</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span><span class=\"n\">author</span><span class=\"o\">.</span><span class=\"n\">get_absolute_url</span><span class=\"p\">())</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">BookInlineFormSet</span><span class=\"p\">(</span><span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">author</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=\"s1\">&#39;manage_books.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;formset&#39;</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\">POST</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> いずれにおいても <code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code> を渡していることに注目してください</p>\n</section>\n<section id=\"specifying-widgets-to-use-in-the-inline-form\">\n<h3>インラインフォームにウィジェットを指定する<a class=\"heading-anchor\" href=\"#specifying-widgets-to-use-in-the-inline-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\">inlineformset_factory</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code> を使っており、多くの引数は <code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code> に渡されます。これは <code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code> と同様に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> 引数を渡すことができることを意味しています。詳細は、上記 <a class=\"reference internal\" href=\"#specifying-widgets-to-use-in-the-form-with-widgets\">Specifying widgets to use in the form with widgets</a> を参照してください。</p>\n</section>\n</section>","rootId":"creating-forms-from-models","toc":[{"title":"ModelForm","anchor":"modelform","children":[{"title":"フィールドの型","anchor":"field-types","children":[]},{"title":"完全な具体例","anchor":"a-full-example","children":[]},{"title":"ModelForm の検証 (バリデーション)","anchor":"validation-on-a-modelform","children":[{"title":"Overriding the clean() method","anchor":"overriding-the-clean-method","children":[]},{"title":"モデルバリデーションとのやり取り","anchor":"interaction-with-model-validation","children":[]},{"title":"モデルの error_messages のレンダリングを考える","anchor":"considerations-regarding-model-s-error-messages","children":[]}]},{"title":"save() メソッド","anchor":"the-save-method","children":[]},{"title":"使うフィールドを選択する","anchor":"selecting-the-fields-to-use","children":[]},{"title":"デフォルトのフィールドをオーバライドする","anchor":"overriding-the-default-fields","children":[]},{"title":"フィールドのローカル化を有効にする","anchor":"enabling-localization-of-fields","children":[]},{"title":"フォームの継承","anchor":"form-inheritance","children":[]},{"title":"Providing initial values","anchor":"providing-initial-values","children":[]},{"title":"ModelForm factory 関数","anchor":"modelform-factory-function","children":[]}]},{"title":"モデルのフォームセット","anchor":"model-formsets","children":[{"title":"クエリセットを変更する","anchor":"changing-the-queryset","children":[]},{"title":"フォームを変更する","anchor":"changing-the-form","children":[]},{"title":"Specifying widgets to use in the form with widgets","anchor":"specifying-widgets-to-use-in-the-form-with-widgets","children":[]},{"title":"Enabling localization for fields with localized_fields","anchor":"enabling-localization-for-fields-with-localized-fields","children":[]},{"title":"Providing initial values","anchor":"id2","children":[]},{"title":"Saving objects in the formset","anchor":"saving-objects-in-the-formset","children":[]},{"title":"Limiting the number of editable objects","anchor":"limiting-the-number-of-editable-objects","children":[]},{"title":"Preventing new objects creation","anchor":"preventing-new-objects-creation","children":[]},{"title":"Using a model formset in a view","anchor":"using-a-model-formset-in-a-view","children":[]},{"title":"Overriding clean() on a ModelFormSet","anchor":"overriding-clean-on-a-modelformset","children":[]},{"title":"Using a custom queryset","anchor":"using-a-custom-queryset","children":[]},{"title":"Using the formset in the template","anchor":"using-the-formset-in-the-template","children":[]}]},{"title":"インラインフォームセット","anchor":"inline-formsets","children":[{"title":"InlineFormSet のメソッドをオーバーライドする","anchor":"overriding-methods-on-an-inlineformset","children":[]},{"title":"複数の外部キーをひとつのモデルが持っている場合","anchor":"more-than-one-foreign-key-to-the-same-model","children":[]},{"title":"ビューでインラインフォームセットを使う","anchor":"using-an-inline-formset-in-a-view","children":[]},{"title":"インラインフォームにウィジェットを指定する","anchor":"specifying-widgets-to-use-in-the-inline-form","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/4.1/topics/"},{"docname":"topics/forms/index","title":"フォームを使う","url":"/ja/4.1/topics/forms/"}],"prev":{"docname":"topics/forms/formsets","title":"フォームセット (Formset)","url":"/ja/4.1/topics/forms/formsets/"},"next":{"docname":"topics/forms/media","title":"フォームアセット (Media クラス)","url":"/ja/4.1/topics/forms/media/"},"formats":{"html":"/ja/4.1/topics/forms/modelforms/","markdown":"/ja/4.1/topics/forms/modelforms.md","json":"/ja/4.1/topics/forms/modelforms.json"},"source":"https://github.com/django/django/blob/stable/4.1.x/docs/topics/forms/modelforms.txt","official":"https://docs.djangoproject.com/ja/4.1/topics/forms/modelforms/","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","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}