{"title":"モデルからフォームを作成する","version":"2.2","locale":"ja","docname":"topics/forms/modelforms","url":"/ja/2.2/topics/forms/modelforms/","canonical":"https://djangodocs.dev/ja/2.2/topics/forms/modelforms/","summary":"データベース中心のアプリケーションを作成している場合、Django モデルに密接にマップするフォームを使うことになるでしょう。","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\">ModelForm</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\">class</span> </em><span class=\"sig-name descname\">ModelForm</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\">BlogComment</code> モデルを持っていて、閲覧者がコメントを送信できるフォームを作成したくなったとしましょう。この場合、すでにモデル内にフィールドが定義されているので、フォーム内にフィールドタイプを改めて定義するのは冗長でしょう。</p>\n<p>このためDjango には、Django モデルから <code class=\"docutils literal notranslate\">Form</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Article\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=\"nc\">ArticleForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>        model <span class=\"o\">=</span> Article\n<span class=\"gp\">... </span>        fields <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>form <span class=\"o\">=</span> ArticleForm<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>article <span class=\"o\">=</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>form <span class=\"o\">=</span> ArticleForm<span class=\"p\">(</span>instance<span class=\"o\">=</span>article<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\">Form</code> クラスは、指定された全てのモデルフィールドに対して、<code class=\"docutils literal notranslate\">fields</code> 属性で指定された順番でフォームフィールドを有します。</p>\n<p>各モデルフィールドは、対応するデフォルトのフォームフィールドを持ちます。例えば、モデル上の <code class=\"docutils literal notranslate\">CharField</code>  はフォーム上で <code class=\"docutils literal notranslate\">CharField</code> として表現されます。モデル <code class=\"docutils literal notranslate\">ManyToManyField</code> は <code class=\"docutils literal notranslate\">MultipleChoiceField</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/2.2/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\">AutoField</code></a></p></td>\n<td><p>フォーム上では表示されません。</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.BigAutoField\" title=\"django.db.models.BigAutoField\"><code class=\"xref py py-class docutils literal notranslate\">BigAutoField</code></a></p></td>\n<td><p>フォーム上では表示されません。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.BigIntegerField\" title=\"django.db.models.BigIntegerField\"><code class=\"xref py py-class docutils literal notranslate\">BigIntegerField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a> で <code class=\"docutils literal notranslate\">min_value</code> が -9223372036854775808 から <code class=\"docutils literal notranslate\">max_value</code> に 9223372036854775807 セットされます。</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.BinaryField\" title=\"django.db.models.BinaryField\"><code class=\"xref py py-class docutils literal notranslate\">BinaryField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\">editable</code></a> がモデルフィールド上で <code class=\"docutils literal notranslate\">True</code> にセットされていた場合、<a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> です。それ以外の場合フォーム内で描画されません。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.BooleanField\" title=\"django.db.models.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\">BooleanField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.BooleanField\" title=\"django.forms.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\">BooleanField</code></a> です。<code class=\"docutils literal notranslate\">null=True</code> の場合は <a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.NullBooleanField\" title=\"django.forms.NullBooleanField\"><code class=\"xref py py-class docutils literal notranslate\">NullBooleanField</code></a> です。</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> で、<code class=\"docutils literal notranslate\">max_length</code> はモデルフィールドの <code class=\"docutils literal notranslate\">max_length</code> にセットされます。また <code class=\"docutils literal notranslate\">null=True</code> の場合 <a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.CharField.empty_value\" title=\"django.forms.CharField.empty_value\"><code class=\"xref py py-attr docutils literal notranslate\">empty_value</code></a> が <code class=\"docutils literal notranslate\">None</code> にセットされます。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\">DateField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.DateField\" title=\"django.forms.DateField\"><code class=\"xref py py-class docutils literal notranslate\">DateField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.DateTimeField\" title=\"django.forms.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.DecimalField\" title=\"django.db.models.DecimalField\"><code class=\"xref py py-class docutils literal notranslate\">DecimalField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.DecimalField\" title=\"django.forms.DecimalField\"><code class=\"xref py py-class docutils literal notranslate\">DecimalField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.DurationField\" title=\"django.db.models.DurationField\"><code class=\"xref py py-class docutils literal notranslate\">DurationField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.DurationField\" title=\"django.forms.DurationField\"><code class=\"xref py py-class docutils literal notranslate\">DurationField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.EmailField\" title=\"django.db.models.EmailField\"><code class=\"xref py py-class docutils literal notranslate\">EmailField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.EmailField\" title=\"django.forms.EmailField\"><code class=\"xref py py-class docutils literal notranslate\">EmailField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.FilePathField\" title=\"django.db.models.FilePathField\"><code class=\"xref py py-class docutils literal notranslate\">FilePathField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.FilePathField\" title=\"django.forms.FilePathField\"><code class=\"xref py py-class docutils literal notranslate\">FilePathField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.FloatField\" title=\"django.db.models.FloatField\"><code class=\"xref py py-class docutils literal notranslate\">FloatField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.FloatField\" title=\"django.forms.FloatField\"><code class=\"xref py py-class docutils literal notranslate\">FloatField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.ModelChoiceField\" title=\"django.forms.ModelChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ModelChoiceField</code></a>\n(see below)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.ImageField\" title=\"django.db.models.ImageField\"><code class=\"xref py py-class docutils literal notranslate\">ImageField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.ImageField\" title=\"django.forms.ImageField\"><code class=\"xref py py-class docutils literal notranslate\">ImageField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.IntegerField\" title=\"django.db.models.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\">IPAddressField</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">IPAddressField</code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.GenericIPAddressField\" title=\"django.db.models.GenericIPAddressField\"><code class=\"xref py py-class docutils literal notranslate\">GenericIPAddressField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.GenericIPAddressField\" title=\"django.forms.GenericIPAddressField\"><code class=\"xref py py-class docutils literal notranslate\">GenericIPAddressField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.ModelMultipleChoiceField\" title=\"django.forms.ModelMultipleChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ModelMultipleChoiceField</code></a> (以下を参照)</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.NullBooleanField\" title=\"django.db.models.NullBooleanField\"><code class=\"xref py py-class docutils literal notranslate\">NullBooleanField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.NullBooleanField\" title=\"django.forms.NullBooleanField\"><code class=\"xref py py-class docutils literal notranslate\">NullBooleanField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.PositiveIntegerField\" title=\"django.db.models.PositiveIntegerField\"><code class=\"xref py py-class docutils literal notranslate\">PositiveIntegerField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.PositiveSmallIntegerField\" title=\"django.db.models.PositiveSmallIntegerField\"><code class=\"xref py py-class docutils literal notranslate\">PositiveSmallIntegerField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.SlugField\" title=\"django.db.models.SlugField\"><code class=\"xref py py-class docutils literal notranslate\">SlugField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.SlugField\" title=\"django.forms.SlugField\"><code class=\"xref py py-class docutils literal notranslate\">SlugField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.SmallIntegerField\" title=\"django.db.models.SmallIntegerField\"><code class=\"xref py py-class docutils literal notranslate\">SmallIntegerField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.TextField\" title=\"django.db.models.TextField\"><code class=\"xref py py-class docutils literal notranslate\">TextField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> で <code class=\"docutils literal notranslate\">widget=forms.Textarea</code> です。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.TimeField\" title=\"django.db.models.TimeField\"><code class=\"xref py py-class docutils literal notranslate\">TimeField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.TimeField\" title=\"django.forms.TimeField\"><code class=\"xref py py-class docutils literal notranslate\">TimeField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.URLField\" title=\"django.db.models.URLField\"><code class=\"xref py py-class docutils literal notranslate\">URLField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.URLField\" title=\"django.forms.URLField\"><code class=\"xref py py-class docutils literal notranslate\">URLField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.UUIDField\" title=\"django.db.models.UUIDField\"><code class=\"xref py py-class docutils literal notranslate\">UUIDField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/fields/#django.forms.UUIDField\" title=\"django.forms.UUIDField\"><code class=\"xref py py-class docutils literal notranslate\">UUIDField</code></a></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>お気付きかもしれませんが、 <code class=\"docutils literal notranslate\">ForeignKey</code> と <code class=\"docutils literal notranslate\">ManyToManyField</code> の 2 つのモデルフィールドは特殊なケースとなります:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">ForeignKey</code> は <code class=\"docutils literal notranslate\">django.forms.ModelChoiceField</code> によって表現され、モデルの <code class=\"docutils literal notranslate\">QuerySet</code> を選択肢として持つ <code class=\"docutils literal notranslate\">ChoiceField</code> です。</p></li>\n<li><p><code class=\"docutils literal notranslate\">ManyToManyField</code> は <code class=\"docutils literal notranslate\">django.forms.ModelMultipleChoiceField</code> によって表現され、モデルの <code class=\"docutils literal notranslate\">QuerySet</code> を選択肢として持つ <code class=\"docutils literal notranslate\">MultipleChoiceField</code> です。</p></li>\n</ul>\n<p>加えて、生成されたフォームフィールドはそれぞれ以下の通り属性がセットされます:</p>\n<ul class=\"simple\">\n<li><p>モデルフィールドに <code class=\"docutils literal notranslate\">blank=True</code> が設定されている場合、フォームフィールド上で <code class=\"docutils literal notranslate\">required</code> が <code class=\"docutils literal notranslate\">False</code> にセットされます。それ以外の場合は <code class=\"docutils literal notranslate\">required=True</code> となります。</p></li>\n<li><p>フォームフィールドの <code class=\"docutils literal notranslate\">label</code> はモデルフィールドの <code class=\"docutils literal notranslate\">verbose_name</code> の最初の文字を大文字にしたものがセットされます。</p></li>\n<li><p>フォームフィールドの <code class=\"docutils literal notranslate\">help_text</code> はモデルフィールドの <code class=\"docutils literal notranslate\">help_text</code> がセットされます。</p></li>\n<li><p>モデルフィールドに <code class=\"docutils literal notranslate\">choices</code> が設定されている場合、フォームフィールドの <code class=\"docutils literal notranslate\">widget</code> は <code class=\"docutils literal notranslate\">Select</code> にセットされ、選択肢にはモデルフィールドの <code class=\"docutils literal notranslate\">choices</code> が使われます。通常、選択肢には空欄の選択肢が追加され、デフォルトで選択されることになります。フィールドが required の場合、ユーザは選択肢を選ぶ必要があります。モデルフィールドに <code class=\"docutils literal notranslate\">blank=False</code> および明示的な <code class=\"docutils literal notranslate\">default</code> 値が設定されている場合、空欄の選択肢は表示されません (代わりに <code class=\"docutils literal notranslate\">default</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm\n\nTITLE_CHOICES <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=\"nc\">Author</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    title <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">,</span> choices<span class=\"o\">=</span>TITLE_CHOICES<span class=\"p\">)</span>\n    birth_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">(</span>blank<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> null<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>name\n\n<span class=\"k\">class</span> <span class=\"nc\">Book</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    authors <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Author<span class=\"p\">)</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Author\n        fields <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=\"nc\">BookForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Book\n        fields <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\">ModelForm</code> サブクラスはおおむね以下と同等と言えます (唯一の違いは <code class=\"docutils literal notranslate\">save()</code> メソッドで、これからすぐ説明します):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    title <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>\n        max_length<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">,</span>\n        widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>Select<span class=\"p\">(</span>choices<span class=\"o\">=</span>TITLE_CHOICES<span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n    birth_date <span class=\"o\">=</span> forms<span class=\"o\">.</span>DateField<span class=\"p\">(</span>required<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">BookForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    authors <span class=\"o\">=</span> forms<span class=\"o\">.</span>ModelMultipleChoiceField<span class=\"p\">(</span>queryset<span class=\"o\">=</span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<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\">ModelForm</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\">ModelForm</code> のバリデーションには、以下の 2 つのステップが存在します:</p>\n<ol class=\"arabic simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/2.2/ref/forms/validation/\"><span class=\"doc\">フォームのバリデーションを実施する</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/2.2/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルのインスタンスのバリデーションを実施する</span></a></p></li>\n</ol>\n<p>通常のフォームのバリデーションと同じように、モデルフォームのバリデーションは <a class=\"reference internal\" href=\"/ja/2.2/ref/forms/api/#django.forms.Form.is_valid\" title=\"django.forms.Form.is_valid\"><code class=\"xref py py-meth docutils literal notranslate\">is_valid()</code></a> が呼ばれたときや <a class=\"reference internal\" href=\"/ja/2.2/ref/forms/api/#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\">errors</code></a> 属性にアクセスしたとき、暗黙的に実行されます。また、実際にはあまり使うメソッドではありませんが、明示的に <code class=\"docutils literal notranslate\">full_clean()</code> を呼んだときにもバリデーションが実行されます。</p>\n<p><code class=\"docutils literal notranslate\">Model</code> バリデーション (<a class=\"reference internal\" href=\"/ja/2.2/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\">Model.full_clean()</code></a>) は、フォームバリデーションのステップ内でフォームの <code class=\"docutils literal notranslate\">clean()</code> メソッドが呼ばれたすぐ直後に実行されます。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>クリーニングのプロセスは、様々な方法で <code class=\"docutils literal notranslate\">ModelForm</code> コンストラクタに渡されたモデルのインスタンスを修正します。例えば、モデル上のあらゆる日付フィールドは、実際の date オブジェクトに変換されます。失敗したバリデーションは、一貫性のない状態でモデルインスタンスを元のままにしておくため、これを再利用するのはお勧めできません。</p>\n</aside>\n<section id=\"overriding-the-clean-method\">\n<span id=\"overriding-modelform-clean-method\"></span><h4>clean() メソッドをオーバーライドする<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\">clean()</code> メソッドをオーバーライドして、バリデーションの動作を追加することができます。</p>\n<p>モデルのオブジェクトに付属したモデルフォームのインスタンスは、<code class=\"docutils literal notranslate\">instance</code> 属性を持ち、メソッドが特定のモデルのインスタンスにアクセスできるようにします。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p><code class=\"docutils literal notranslate\">ModelForm.clean()</code> メソッドは、<a class=\"reference internal\" href=\"/ja/2.2/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルバリデーション</span></a> に、<code class=\"docutils literal notranslate\">unique</code>、<code class=\"docutils literal notranslate\">unique_together</code> または <code class=\"docutils literal notranslate\">unique_for_date|month|year</code> としてマークされたモデルフィールドの一意性を検証させます。</p>\n<p><code class=\"docutils literal notranslate\">clean()</code> メソッドをオーバーライドして、なおかつこのバリデーションを維持したい場合、親クラスの <code class=\"docutils literal notranslate\">clean()</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\">ModelForm</code> フォーム上で対応するフィールドを持つモデルのそれぞれのフィールドの <code class=\"docutils literal notranslate\">clean()</code> メソッドを呼び出します。モデルフィールドを除外した場合、これらのフィールドに対してはバリデーションが実行されません。フィールドのクリーニングとバリデーションの詳しい働き方については、<a class=\"reference internal\" href=\"/ja/2.2/ref/forms/validation/\"><span class=\"doc\">フォームバリデーション</span></a> ドキュメントを参照してください。</p>\n<p>モデルの <code class=\"docutils literal notranslate\">clean()</code> メソッドは一意性のチェックがされる前に呼び出されます。モデルの <code class=\"docutils literal notranslate\">clean()</code> フックのより詳しい情報については、<a class=\"reference internal\" href=\"/ja/2.2/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\">error_messages</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/2.2/ref/forms/fields/#django.forms.Field.error_messages\" title=\"django.forms.Field.error_messages\"><code class=\"xref py py-attr docutils literal notranslate\">フォームフィールド</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/2.2/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\">モデルフィールド</code></a> のレベルで定義されたエラーメッセージより優先されます。</p>\n<p><a class=\"reference internal\" href=\"/ja/2.2/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\">モデルフィールド</code></a> で定義されたエラーメッセージは、<a class=\"reference internal\" href=\"/ja/2.2/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルバリデーション</span></a> のステップの間に <code class=\"docutils literal notranslate\">ValidationError</code> が発生したときに、対応するエラーメッセージがフォームのレベルで定義されていない場合にのみ使用されます。</p>\n<p><a class=\"reference internal\" href=\"/ja/2.2/ref/exceptions/#django.core.exceptions.NON_FIELD_ERRORS\" title=\"django.core.exceptions.NON_FIELD_ERRORS\"><code class=\"xref py py-data docutils literal notranslate\">NON_FIELD_ERRORS</code></a> キーを <code class=\"docutils literal notranslate\">Meta</code> クラス内の <code class=\"docutils literal notranslate\">error_messages</code> ディクショナリに追加することで、モデルバリデーションによって発生する <code class=\"docutils literal notranslate\">NON_FIELD_ERRORS</code> に対するエラーメッセージをオーバーライドできます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.core.exceptions</span> <span class=\"kn\">import</span> NON_FIELD_ERRORS\n<span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm\n\n<span class=\"k\">class</span> <span class=\"nc\">ArticleForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        error_messages <span class=\"o\">=</span> <span class=\"p\">{</span>\n            NON_FIELD_ERRORS<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\">save()</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>全ての <code class=\"docutils literal notranslate\">ModelForm</code> は <code class=\"docutils literal notranslate\">save()</code> メソッドも持っています。このメソッドは、フォームに結びつけられたデータからデータベースオブジェクトを生成して保存します。<code class=\"docutils literal notranslate\">ModelForm</code> のサブクラスはキーワード引数 <code class=\"docutils literal notranslate\">instance</code> として既存のモデルインスタンスを受け取ることができます; これが指定されると、<code class=\"docutils literal notranslate\">save()</code> はそのインスタンスを更新するようになります。 指定されない場合は、<code class=\"docutils literal notranslate\">save()</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=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Article\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">myapp.forms</span> <span class=\"kn\">import</span> ArticleForm\n\n<span class=\"go\"># Create a form instance from POST data.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ArticleForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<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>new_article <span class=\"o\">=</span> f<span class=\"o\">.</span>save<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>a <span class=\"o\">=</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ArticleForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> instance<span class=\"o\">=</span>a<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>save<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\">save()</code> を呼び出すと、<code class=\"docutils literal notranslate\">form.errors</code> をチェックすることでこれを行います。フォーム内のデータが適正ではない場合は <code class=\"docutils literal notranslate\">ValueError</code> が発生します -- 例えば、<code class=\"docutils literal notranslate\">form.errors</code> が <code class=\"docutils literal notranslate\">True</code> だと評価された場合です。</p>\n<p>オプションのフィールドがフォームのデータに表示されない場合、結果のモデルインスタンスはモデルフィールドの <a class=\"reference internal\" href=\"/ja/2.2/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\">default</code></a> を使用します。この動作は、 <a class=\"reference internal\" href=\"/ja/2.2/ref/forms/widgets/#django.forms.CheckboxInput\" title=\"django.forms.CheckboxInput\"><code class=\"xref py py-class docutils literal notranslate\">CheckboxInput</code></a>, <a class=\"reference internal\" href=\"/ja/2.2/ref/forms/widgets/#django.forms.CheckboxSelectMultiple\" title=\"django.forms.CheckboxSelectMultiple\"><code class=\"xref py py-class docutils literal notranslate\">CheckboxSelectMultiple</code></a>, または <a class=\"reference internal\" href=\"/ja/2.2/ref/forms/widgets/#django.forms.SelectMultiple\" title=\"django.forms.SelectMultiple\"><code class=\"xref py py-class docutils literal notranslate\">SelectMultiple</code></a> (または <a class=\"reference internal\" href=\"/ja/2.2/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\">value_omitted_from_data()</code></a> メソッドが常に <code class=\"docutils literal notranslate\">False</code> を返すカスタムウィジェット) を使用するフィールドには適用されません。チェックされていないチェックボックスと、選択されていない <code class=\"docutils literal notranslate\">&lt;select multiple&gt;</code> は HTML フォーム送信のデータには表示されないからです。 API を設計していて、これらのウィジェットを使用するフィールドのデフォルトのフォールバック動作が必要な場合は、カスタムフォームフィールドまたはウィジェットを使用します。</p>\n<p>この <code class=\"docutils literal notranslate\">save()</code> には、省略可能な <code class=\"docutils literal notranslate\">commit</code> キーワード引数があり、<code class=\"docutils literal notranslate\">True</code> ないし <code class=\"docutils literal notranslate\">False</code> を取ります。<code class=\"docutils literal notranslate\">save()</code> を <code class=\"docutils literal notranslate\">commit=False</code> で呼び出した場合、データベースにまだ保存されていないオブジェクトを返します。この場合、結果のモデルインスタンスで <code class=\"docutils literal notranslate\">save()</code> を呼び出すかどうかはあなた次第です。これは、保存前にオブジェクトで独自のプロセスを実行したい場合、もしくは特別な <a class=\"reference internal\" href=\"/ja/2.2/ref/models/instances/#ref-models-force-insert\"><span class=\"std std-ref\">モデル保存オプション</span></a> を使いたい場合に有用です。 <code class=\"docutils literal notranslate\">commit</code> はデフォルトでは <code class=\"docutils literal notranslate\">True</code> です。</p>\n<p><code class=\"docutils literal notranslate\">commit=False</code> を使う際のもう 1 つの副作用は、モデルに他のモデルとの多対多の関係がある場合に見られます。フォームを save するときにモデルに多対多の関係があり <code class=\"docutils literal notranslate\">commit=False</code> を指定した場合、Django は多対多の関係に対してフォームのデータを即座に保存することができません。これは、インスタンスがデータベース上に存在するようになるまで、インスタンスに対して多対多のデータを保存することが不可能だからです。</p>\n<p>この問題を扱うために、<code class=\"docutils literal notranslate\">commit=False</code> を使ったフォームを save するたびに、Django は <code class=\"docutils literal notranslate\">save_m2m()</code> メソッドをあなたの <code class=\"docutils literal notranslate\">ModelForm</code> サブクラスに追加します。フォームによって生成されたインスタンスを手動で save した後に、多対多のフォームデータを保存するために <code class=\"docutils literal notranslate\">save_m2m()</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=\"c1\"># Create a form instance with POST data.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> f <span class=\"o\">=</span> AuthorForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<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> new_author <span class=\"o\">=</span> f<span class=\"o\">.</span>save<span class=\"p\">(</span>commit<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> new_author<span class=\"o\">.</span>some_field <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> new_author<span class=\"o\">.</span>save<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> f<span class=\"o\">.</span>save_m2m<span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">save_m2m()</code> の呼び出しは、<code class=\"docutils literal notranslate\">save(commit=False)</code> を使った場合にのみ必要となります。フォーム上で単に <code class=\"docutils literal notranslate\">save()</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=\"c1\"># Create a form instance with POST data.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> a <span class=\"o\">=</span> Author<span class=\"p\">()</span>\n<span class=\"o\">&gt;&gt;&gt;</span> f <span class=\"o\">=</span> AuthorForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> instance<span class=\"o\">=</span>a<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> new_author <span class=\"o\">=</span> f<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">save()</code> と <code class=\"docutils literal notranslate\">save_m2m()</code> メソッドのほかは、<code class=\"docutils literal notranslate\">ModelForm</code> は <code class=\"docutils literal notranslate\">forms</code> のフォームとまったく同じ方法で動作します。例えば、<code class=\"docutils literal notranslate\">is_valid()</code> メソッドは妥当性をチェックするために使用される、<code class=\"docutils literal notranslate\">is_multipart()</code> メソッドはフォームがマルチパートのファイルアップロードを必要とするかどうかを (ゆえに <code class=\"docutils literal notranslate\">request.FILES</code> がフォームに渡される必要があるかどうかも) 決める、などです。詳しくは <a class=\"reference internal\" href=\"/ja/2.2/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\">fields</code> 属性を使って、フォームで編集すべき全てのフィールドを明示的に指定することを強くお勧めします。そうしないと、フォームで予期せず特定のフィールドを設定できるようになり、セキュリティ上の問題が発生しやすくなります。特に新しいフィールドがモデルに追加されたときに起こりがちです。フォームのレンダリング方法によっては、Webページで問題が目に見えないことさえあります。</p>\n<p>代わりの方法は、全てのフィールドを自動的に含めるか、いくつかのフィールドのみをブラックリスト化することです。この基本的なアプローチは安全性が低く、主要なウェブサイトで深刻な悪用 (例えば <a class=\"reference external\" href=\"https://github.com/blog/1068-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\">fields</code> 属性に、特殊な値 <code class=\"docutils literal notranslate\">'__all__'</code> をセットして、モデル内の全てのフィールドが使われるように指定します。例えば:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Author\n        fields <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\">ModelForm</code> の中の <code class=\"docutils literal notranslate\">Meta</code> クラスの <code class=\"docutils literal notranslate\">exclude</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=\"nc\">PartialAuthorForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Author\n        exclude <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\">Author</code> モデルは 3 つのフィールド <code class=\"docutils literal notranslate\">name</code>、<code class=\"docutils literal notranslate\">title</code>、<code class=\"docutils literal notranslate\">birth_date</code> を持っているため、これで <code class=\"docutils literal notranslate\">name</code> と <code class=\"docutils literal notranslate\">birth_date</code> がフォームに表示されることになります。</p>\n</li>\n</ol>\n<p>このどちらかが使われた場合、フォーム内で表示されるフィールドの順番はモデル内でフィールドが定義された順番となり、<code class=\"docutils literal notranslate\">ManyToManyField</code> インスタンスは最後に表示されます。</p>\n<p>加えて、Django は以下のルールも適用します: モデルフィールドで <code class=\"docutils literal notranslate\">editable=False</code> をセットした場合、<code class=\"docutils literal notranslate\">ModelForm</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\">save()</code> メソッドでセットされません。また、除外したフィールドを手動でフォームに追加し直した場合、モデルインスタンスから初期化されることはありません。</p>\n<p>Django は不完全なモデルを保存しないようにするため、モデルの設定でフィールドを空にすることを許容しておらず、かつ除外されたフィールドに対するデフォルト値を指定しなかった場合、除外されたフィールドを含む <code class=\"docutils literal notranslate\">ModelForm</code> を <code class=\"docutils literal notranslate\">save()</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>author <span class=\"o\">=</span> Author<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s1\">&#39;Mr&#39;</span><span class=\"p\">)</span>\nform <span class=\"o\">=</span> PartialAuthorForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> instance<span class=\"o\">=</span>author<span class=\"p\">)</span>\nform<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>もしくは、<code class=\"docutils literal notranslate\">save(commit=False)</code> を使って手動で追加の必須フィールドをセットできます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>form <span class=\"o\">=</span> PartialAuthorForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">)</span>\nauthor <span class=\"o\">=</span> form<span class=\"o\">.</span>save<span class=\"p\">(</span>commit<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\nauthor<span class=\"o\">.</span>title <span class=\"o\">=</span> <span class=\"s1\">&#39;Mr&#39;</span>\nauthor<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">save(commit=False)</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\">DateField</code> がある場合、フォーム内で <code class=\"docutils literal notranslate\">DateField</code> として表示したいことでしょう。しかし、<code class=\"docutils literal notranslate\">ModelForm</code> では、与えられたモデルに足してフォームフィールドを変更する柔軟性があります。</p>\n<p>フィールドに対して独自のウィジェットを指定するには、内部の <code class=\"docutils literal notranslate\">Meta</code> クラスの <code class=\"docutils literal notranslate\">widgets</code> を使用してください。これは、フィールド名としジェットのクラスやインスタンスをマッピングするディクショナリです。</p>\n<p>例えば、<code class=\"docutils literal notranslate\">Authoer</code> の <code class=\"docutils literal notranslate\">name</code> 属性に対する <code class=\"docutils literal notranslate\">CharField</code> を、デフォルトの <code class=\"docutils literal notranslate\">&lt;input type=&quot;text&quot;&gt;</code> の代わりに <code class=\"docutils literal notranslate\">&lt;textarea&gt;</code> で表示したい場合、フィールドのウィジェットをオーバーライドすることができます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm<span class=\"p\">,</span> Textarea\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Author\n        fields <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        widgets <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> Textarea<span class=\"p\">(</span>attrs<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\">widgets</code> dictionary accepts either widget instances (e.g.,\n<code class=\"docutils literal notranslate\">Textarea(...)</code>) or classes (e.g., <code class=\"docutils literal notranslate\">Textarea</code>). Note that the <code class=\"docutils literal notranslate\">widgets</code>\ndictionary is ignored for a model field with a non-empty <code class=\"docutils literal notranslate\">choices</code> attribute.\nIn this case, you must override the form field to use a different widget.</p>\n<p>同様に、フィールドをさらにカスタマイズしたい場合、内部の <code class=\"docutils literal notranslate\">Meta</code> クラスの <code class=\"docutils literal notranslate\">labels</code>、<code class=\"docutils literal notranslate\">help_texts</code>、<code class=\"docutils literal notranslate\">error_messages</code> と言った属性を指定することができます。</p>\n<p>例えば、<code class=\"docutils literal notranslate\">name</code> フィールドに対する文字列に直面する全てのユーザの文章をカスタマイズしたい場合:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Author\n        fields <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        labels <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> _<span class=\"p\">(</span><span class=\"s1\">&#39;Writer&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">}</span>\n        help_texts <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</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        error_messages <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=\"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\">field_classes</code> を指定して、フォームによってインスタンス化されたフィールドのタイプをカスタマイズすることもできます。</p>\n<p>例えば、<code class=\"docutils literal notranslate\">slug</code> フィールドに対して <code class=\"docutils literal notranslate\">MySlugFormField</code> を使いたい場合、以下のようにできます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Article\n\n<span class=\"k\">class</span> <span class=\"nc\">ArticleForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Article\n        fields <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        field_classes <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;slug&#39;</span><span class=\"p\">:</span> MySlugFormField<span class=\"p\">,</span>\n        <span class=\"p\">}</span>\n</code></pre></div>\n<p>最後に、フィールドを完全に -- タイプ、バリデータ、必須かどうかなどを含めて -- コントロールしたい場合、通常の <code class=\"docutils literal notranslate\">Form</code> で行うのと同じようにフィールドを宣言的に指定することで実現できます。</p>\n<p>フィールドのバリデータを指定したい場合、フィールドを宣言的に定義して <code class=\"docutils literal notranslate\">validators</code> パラメータを設定することで実現できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> CharField<span class=\"p\">,</span> ModelForm\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Article\n\n<span class=\"k\">class</span> <span class=\"nc\">ArticleForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    slug <span class=\"o\">=</span> CharField<span class=\"p\">(</span>validators<span class=\"o\">=</span><span class=\"p\">[</span>validate_slug<span class=\"p\">])</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Article\n        fields <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\">ModelForm</code> と 通常の <code class=\"docutils literal notranslate\">Form</code> が連動する方法を理解することが重要となります。</p>\n<p><code class=\"docutils literal notranslate\">ModelForm</code> は、特定のフィールドを自動的に生成できる通常の <code class=\"docutils literal notranslate\">Form</code> です。自動的に生成されるフィールドは、<code class=\"docutils literal notranslate\">Meta</code> クラスの内容とどのフィールドが宣言的に定義されているかに依存します。基本的に、<code class=\"docutils literal notranslate\">ModelForm</code> は フォームから <strong>除外された</strong> フィールド、言い換えると宣言的に定義されなかったフィールド <strong>のみ</strong> を生成します。</p>\n<p>宣言的に定義されたフィールドはそのままになります。したがって、<code class=\"docutils literal notranslate\">Meta</code> 属性に対するカスタマイズ、例えば <code class=\"docutils literal notranslate\">widgets</code>、<code class=\"docutils literal notranslate\">labels</code>、<code class=\"docutils literal notranslate\">help_texts</code>、<code class=\"docutils literal notranslate\">error_messages</code> は無視されます; これらは自動的に生成されたフィールドにのみ適用されます。</p>\n<p>同様に、宣言的に定義されたフィールドは、対応するモデルから引き継がれた <code class=\"docutils literal notranslate\">max_length</code> や <code class=\"docutils literal notranslate\">required</code> のような属性を描画しません。モデル内で定義された動作を引き継ぎたい場合は、フォームフィールドを宣言する際に明示的に関連する属性をセットする必要があります。</p>\n<p>例えば、<code class=\"docutils literal notranslate\">Article</code> モデルは以下のようになります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">Article</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    headline <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>\n        max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">,</span>\n        null<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        blank<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        help_text<span class=\"o\">=</span><span class=\"s1\">&#39;Use puns liberally&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    content <span class=\"o\">=</span> models<span class=\"o\">.</span>TextField<span class=\"p\">()</span>\n</code></pre></div>\n<p>そして、指定されたとおりに <code class=\"docutils literal notranslate\">blank</code> と <code class=\"docutils literal notranslate\">help_text</code> が維持されている一方で、<code class=\"docutils literal notranslate\">headline</code> に対して独自のバリデーションを実施するために、<code class=\"docutils literal notranslate\">ArticleForm</code> を以下のように定義します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">ArticleForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    headline <span class=\"o\">=</span> MyFormField<span class=\"p\">(</span>\n        max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">,</span>\n        required<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n        help_text<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=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Article\n        fields <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/2.2/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\">ModelForm</code> 内のフィールドはデータをローカル化しません。フィールドに対してローカル化を有効にするために、<code class=\"docutils literal notranslate\">Meat</code> クラスの <code class=\"docutils literal notranslate\">localized_fields</code> 属性を使うことができます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">AuthorForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>        model <span class=\"o\">=</span> Author\n<span class=\"gp\">... </span>        localized_fields <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\">localized_fields</code> が特殊な値 <code class=\"docutils literal notranslate\">'__all__'</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\">ModelForms</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\">ArticleForm</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=\"nc\">EnhancedArticleForm</span><span class=\"p\">(</span>ArticleForm<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">def</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\">ArticleForm</code>, except there's\nsome extra validation and cleaning for the <code class=\"docutils literal notranslate\">pub_date</code> field.</p>\n<p>You can also subclass the parent's <code class=\"docutils literal notranslate\">Meta</code> inner class if you want to change\nthe <code class=\"docutils literal notranslate\">Meta.fields</code> or <code class=\"docutils literal notranslate\">Meta.exclude</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=\"nc\">RestrictedArticleForm</span><span class=\"p\">(</span>EnhancedArticleForm<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">(</span>ArticleForm<span class=\"o\">.</span>Meta<span class=\"p\">):</span>\n<span class=\"gp\">... </span>        exclude <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\">EnhancedArticleForm</code> and modifies\nthe original <code class=\"docutils literal notranslate\">ArticleForm.Meta</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\">Meta</code> inner class, only the first one will be\nused. This means the child's <code class=\"docutils literal notranslate\">Meta</code>, if it exists, otherwise the\n<code class=\"docutils literal notranslate\">Meta</code> of the first parent, etc.</p></li>\n<li><p>It's possible to inherit from both <code class=\"docutils literal notranslate\">Form</code> and <code class=\"docutils literal notranslate\">ModelForm</code> simultaneously,\nhowever, you must ensure that <code class=\"docutils literal notranslate\">ModelForm</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\">Field</code> inherited from a parent class by\nsetting the name to be <code class=\"docutils literal notranslate\">None</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\">ModelForm</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\">initial</code> パラメータを指定することで、フォームに対する初期値を指定することができます。この方法で提供された初期値は、 フォームフィールドによる初期値と結びついたモデルインスタンスからの初期値の両方をオーバーライドします。例えば:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>article <span class=\"o\">=</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>article<span class=\"o\">.</span>headline\n<span class=\"go\">&#39;My headline&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>form <span class=\"o\">=</span> ArticleForm<span class=\"p\">(</span>initial<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> instance<span class=\"o\">=</span>article<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>form<span class=\"p\">[</span><span class=\"s1\">&#39;headline&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>value<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/2.2/ref/forms/models/#django.forms.models.modelform_factory\" title=\"django.forms.models.modelform_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelform_factory()</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> modelform_factory\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Book\n<span class=\"gp\">&gt;&gt;&gt; </span>BookForm <span class=\"o\">=</span> modelform_factory<span class=\"p\">(</span>Book<span class=\"p\">,</span> fields<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>これは、既存のフォームに対してシンプルな修正を加えたい場合にも使用できます。例えば、与えられたフィールドに対して使われるウィジェットを指定できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> Textarea\n<span class=\"gp\">&gt;&gt;&gt; </span>Form <span class=\"o\">=</span> modelform_factory<span class=\"p\">(</span>Book<span class=\"p\">,</span> form<span class=\"o\">=</span>BookForm<span class=\"p\">,</span>\n<span class=\"gp\">... </span>                         widgets<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> Textarea<span class=\"p\">()})</span>\n</code></pre></div>\n<p>含むフィールドは <code class=\"docutils literal notranslate\">fields</code> や <code class=\"docutils literal notranslate\">exclude</code> のキーワード引数、もしくは <code class=\"docutils literal notranslate\">ModelForm</code> 内部の <code class=\"docutils literal notranslate\">Meta</code> クラスの対応する属性を使って指定できます。<code class=\"docutils literal notranslate\">ModelForm</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>Form <span class=\"o\">=</span> modelform_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> form<span class=\"o\">=</span>AuthorForm<span class=\"p\">,</span> localized_fields<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\">class</span> </em><span class=\"sig-prename descclassname\">models.</span><span class=\"sig-name descname\">BaseModelFormSet</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><a class=\"reference internal\" href=\"/ja/2.2/topics/forms/formsets/\"><span class=\"doc\">通常のフォームセット</span></a> のように、Django には Django モデルを簡単に扱うための拡張的なフォームセットのクラスが用意されています。前述の <code class=\"docutils literal notranslate\">Author</code> モデルを再利用して見ていきましょう:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> modelformset_factory\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n<span class=\"gp\">&gt;&gt;&gt; </span>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> fields<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\">fields</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>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> exclude<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\">Author</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>formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>formset<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-MAX_NUM_FORMS&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/2.2/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelformset_factory()</code></a> はフォームセットの生成に <a class=\"reference internal\" href=\"/ja/2.2/ref/forms/formsets/#django.forms.formsets.formset_factory\" title=\"django.forms.formsets.formset_factory\"><code class=\"xref py py-func docutils literal notranslate\">formset_factory()</code></a> を使います。これは、モデルフォームが特定のモデルとやり取りする方法を知っている基本的なフォームセットの拡張だと言うことを意味します。</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/2.2/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\">&lt;parent_model_name&gt;_ptr</code>) instead of an <code class=\"docutils literal notranslate\">id</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\">Author.objects.all()</code>) を使用します。 <code class=\"docutils literal notranslate\">queryset</code> 属性を使うことで、この動作をオーバーライドできます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>queryset<span class=\"o\">=</span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__startswith<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\">__init__</code> の中で <code class=\"docutils literal notranslate\">self.queryset</code> をセットするサブクラスを作成できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> BaseModelFormSet\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n\n<span class=\"k\">class</span> <span class=\"nc\">BaseAuthorFormSet</span><span class=\"p\">(</span>BaseModelFormSet<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>queryset <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__startswith<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\">BaseAuthorFormSet</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>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Author<span class=\"p\">,</span> fields<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> formset<span class=\"o\">=</span>BaseAuthorFormSet<span class=\"p\">)</span>\n</code></pre></div>\n<p>モデルの既存のインスタンスを <em>含まない</em> フォームセットを返したい場合は、空の 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>AuthorFormSet<span class=\"p\">(</span>queryset<span class=\"o\">=</span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>none<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\">modelformset_factory</code>, a model form will\nbe created using <a class=\"reference internal\" href=\"/ja/2.2/ref/forms/models/#django.forms.models.modelform_factory\" title=\"django.forms.models.modelform_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelform_factory()</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=\"nc\">AuthorForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Author\n        fields <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=\"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>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> form<span class=\"o\">=</span>AuthorForm<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\">modelformset_factory</code> function has several arguments which are\npassed through to <code class=\"docutils literal notranslate\">modelform_factory</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\">widgets</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\">widgets</code> parameter, you can specify a dictionary of values to\ncustomize the <code class=\"docutils literal notranslate\">ModelForm</code>’s widget class for a particular field. This\nworks the same way as the <code class=\"docutils literal notranslate\">widgets</code> dictionary on the inner <code class=\"docutils literal notranslate\">Meta</code>\nclass of a <code class=\"docutils literal notranslate\">ModelForm</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>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Author<span class=\"p\">,</span> fields<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>    widgets<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> Textarea<span class=\"p\">(</span>attrs<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\">localized_fields</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\">localized_fields</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>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Author<span class=\"p\">,</span> fields<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>    localized_fields<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\">localized_fields</code> が特殊な値 <code class=\"docutils literal notranslate\">'__all__'</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/2.2/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\">initial</code>\nparameter when instantiating the model formset class returned by\n<a class=\"reference internal\" href=\"/ja/2.2/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelformset_factory()</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\">initial</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\">ModelForm</code>, you can save the data as a model object. This is done\nwith the formset's <code class=\"docutils literal notranslate\">save()</code> method:</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=\"c1\"># Create a formset instance with POST data.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<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> instances <span class=\"o\">=</span> formset<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\">save()</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\">instances</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\">save()</code> method. You can find\nmore information about this restriction, which also holds for regular\n<code class=\"docutils literal notranslate\">ModelForms</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\">commit=False</code> to return the unsaved model instances:</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=\"c1\"># don&#39;t save to the database</span>\n<span class=\"o\">&gt;&gt;&gt;</span> instances <span class=\"o\">=</span> formset<span class=\"o\">.</span>save<span class=\"p\">(</span>commit<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> instance <span class=\"ow\">in</span> instances<span class=\"p\">:</span>\n<span class=\"o\">...</span>     <span class=\"c1\"># do something with instance</span>\n<span class=\"o\">...</span>     instance<span class=\"o\">.</span>save<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\">ManyToManyField</code>, you'll also\nneed to call <code class=\"docutils literal notranslate\">formset.save_m2m()</code> to ensure the many-to-many relationships\nare saved properly.</p>\n<p>After calling <code class=\"docutils literal notranslate\">save()</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\">models.BaseModelFormSet.</span><span class=\"sig-name descname\">changed_objects</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\">models.BaseModelFormSet.</span><span class=\"sig-name descname\">deleted_objects</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\">models.BaseModelFormSet.</span><span class=\"sig-name descname\">new_objects</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\">max_num</code> and <code class=\"docutils literal notranslate\">extra</code> parameters\nto <a class=\"reference internal\" href=\"/ja/2.2/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelformset_factory()</code></a> to limit the number of\nextra forms displayed.</p>\n<p><code class=\"docutils literal notranslate\">max_num</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>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<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>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,),</span> max_num<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>queryset<span class=\"o\">=</span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<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>x<span class=\"o\">.</span>name <span class=\"k\">for</span> x <span class=\"ow\">in</span> formset<span class=\"o\">.</span>get_queryset<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\">extra=0</code> doesn't prevent creation of new model instances as you can\n<a class=\"reference internal\" href=\"/ja/2.2/topics/forms/formsets/#understanding-the-managementform\"><span class=\"std std-ref\">add additional forms with JavaScript</span></a>\nor just send additional POST data. Formsets <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/26142\">don't yet provide\nfunctionality</a> for an &quot;edit only&quot; view that prevents creation of new\ninstances.</p>\n<p>If the value of <code class=\"docutils literal notranslate\">max_num</code> is greater than the number of existing related\nobjects, up to <code class=\"docutils literal notranslate\">extra</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\">max_num</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>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,),</span> max_num<span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">,</span> extra<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>queryset<span class=\"o\">=</span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<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> form <span class=\"ow\">in</span> formset<span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span>form<span class=\"o\">.</span>as_table<span class=\"p\">())</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_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\">max_num</code> の値が <code class=\"docutils literal notranslate\">None</code> (デフォルト) だった場合、表示されるフォームの上限は大きな数になります (1000)。この数は、実際には制限がないと見なせるでしょう。</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\">Author</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> modelformset_factory\n<span class=\"kn\">from</span> <span class=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n\n<span class=\"k\">def</span> <span class=\"nf\">manage_authors</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> fields<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> request<span class=\"o\">.</span>method <span class=\"o\">==</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">:</span>\n        formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> request<span class=\"o\">.</span>FILES<span class=\"p\">)</span>\n        <span class=\"k\">if</span> formset<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            formset<span class=\"o\">.</span>save<span class=\"p\">()</span>\n            <span class=\"c1\"># do something.</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">()</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<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> formset<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\">formset.save()</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\">clean()</code> on a <code class=\"docutils literal notranslate\">ModelFormSet</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\">ModelForms</code>, by default the <code class=\"docutils literal notranslate\">clean()</code> method of a\n<code class=\"docutils literal notranslate\">ModelFormSet</code> will validate that none of the items in the formset violate\nthe unique constraints on your model (either <code class=\"docutils literal notranslate\">unique</code>, <code class=\"docutils literal notranslate\">unique_together</code> or\n<code class=\"docutils literal notranslate\">unique_for_date|month|year</code>).  If you want to override the <code class=\"docutils literal notranslate\">clean()</code> method\non a <code class=\"docutils literal notranslate\">ModelFormSet</code> and maintain this validation, you must call the parent\nclass's <code class=\"docutils literal notranslate\">clean</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> BaseModelFormSet\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModelFormSet</span><span class=\"p\">(</span>BaseModelFormSet<span class=\"p\">):</span>\n    <span class=\"k\">def</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>clean<span class=\"p\">()</span>\n        <span class=\"c1\"># example custom validation across forms in the formset</span>\n        <span class=\"k\">for</span> form <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>forms<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\">Form</code>. Modifying a value in\n<code class=\"docutils literal notranslate\">form.cleaned_data</code> is not sufficient to affect the saved value. If you wish\nto modify a value in <code class=\"docutils literal notranslate\">ModelFormSet.clean()</code> you must modify\n<code class=\"docutils literal notranslate\">form.instance</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> BaseModelFormSet\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModelFormSet</span><span class=\"p\">(</span>BaseModelFormSet<span class=\"p\">):</span>\n    <span class=\"k\">def</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>clean<span class=\"p\">()</span>\n\n        <span class=\"k\">for</span> form <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>forms<span class=\"p\">:</span>\n            name <span class=\"o\">=</span> form<span class=\"o\">.</span>cleaned_data<span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span>upper<span class=\"p\">()</span>\n            form<span class=\"o\">.</span>cleaned_data<span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> name\n            <span class=\"c1\"># update the instance value.</span>\n            form<span class=\"o\">.</span>instance<span class=\"o\">.</span>name <span class=\"o\">=</span> name\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=\"nn\">django.forms</span> <span class=\"kn\">import</span> modelformset_factory\n<span class=\"kn\">from</span> <span class=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n\n<span class=\"k\">def</span> <span class=\"nf\">manage_authors</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> fields<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> request<span class=\"o\">.</span>method <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>\n            request<span class=\"o\">.</span>POST<span class=\"p\">,</span> request<span class=\"o\">.</span>FILES<span class=\"p\">,</span>\n            queryset<span class=\"o\">=</span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;O&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">)</span>\n        <span class=\"k\">if</span> formset<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            formset<span class=\"o\">.</span>save<span class=\"p\">()</span>\n            <span class=\"c1\"># Do something.</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>queryset<span class=\"o\">=</span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;O&#39;</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<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> formset<span class=\"p\">})</span>\n</code></pre></div>\n<p>Note that we pass the <code class=\"docutils literal notranslate\">queryset</code> argument in both the <code class=\"docutils literal notranslate\">POST</code> and <code class=\"docutils literal notranslate\">GET</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/2.2/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\">{% for %}</code> loop, you'll need to render the primary key field. For example,\nif you were rendering the <code class=\"docutils literal notranslate\">name</code> and <code class=\"docutils literal notranslate\">age</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\">{{ form.id }}</code>. This ensures that\nthe model formset, in the <code class=\"docutils literal notranslate\">POST</code> case, will work correctly. (This example\nassumes a primary key named <code class=\"docutils literal notranslate\">id</code>. If you've explicitly defined your own\nprimary key that isn't called <code class=\"docutils literal notranslate\">id</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\">class</span> </em><span class=\"sig-prename descclassname\">models.</span><span class=\"sig-name descname\">BaseInlineFormSet</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Author</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">Book</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    author <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Author<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    title <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> inlineformset_factory\n<span class=\"gp\">&gt;&gt;&gt; </span>BookFormSet <span class=\"o\">=</span> inlineformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> Book<span class=\"p\">,</span> fields<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>author <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Mike Royko&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>formset <span class=\"o\">=</span> BookFormSet<span class=\"p\">(</span>instance<span class=\"o\">=</span>author<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">BookFormSet</code>'s <a class=\"reference internal\" href=\"/ja/2.2/topics/forms/formsets/#formset-prefix\"><span class=\"std std-ref\">prefix</span></a> is <code class=\"docutils literal notranslate\">'book_set'</code>\n(<code class=\"docutils literal notranslate\">&lt;model name&gt;_set</code> ). If <code class=\"docutils literal notranslate\">Book</code>'s <code class=\"docutils literal notranslate\">ForeignKey</code> to <code class=\"docutils literal notranslate\">Author</code> has a\n<a class=\"reference internal\" href=\"/ja/2.2/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\">related_name</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/2.2/ref/forms/models/#django.forms.models.inlineformset_factory\" title=\"django.forms.models.inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">inlineformset_factory()</code></a> は、 <a class=\"reference internal\" href=\"/ja/2.2/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelformset_factory()</code></a> を使い、<code class=\"docutils literal notranslate\">can_delete=True</code> をセットします。</p>\n</aside>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">参考</p>\n<p><a class=\"reference internal\" href=\"/ja/2.2/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\">InlineFormSet</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\">InlineFormSet</code> のメソッドをオーバーライドするには、 <a class=\"reference internal\" href=\"#django.forms.models.BaseModelFormSet\" title=\"django.forms.models.BaseModelFormSet\"><code class=\"xref py py-class docutils literal notranslate\">BaseModelFormSet</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\">BaseInlineFormSet</code></a> をサブクラス化します。</p>\n<p>例えば、 <code class=\"docutils literal notranslate\">clean()</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> BaseInlineFormSet\n\n<span class=\"k\">class</span> <span class=\"nc\">CustomInlineFormSet</span><span class=\"p\">(</span>BaseInlineFormSet<span class=\"p\">):</span>\n    <span class=\"k\">def</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>clean<span class=\"p\">()</span>\n        <span class=\"c1\"># example custom validation across forms in the formset</span>\n        <span class=\"k\">for</span> form <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>forms<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\">formset</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> inlineformset_factory\n<span class=\"gp\">&gt;&gt;&gt; </span>BookFormSet <span class=\"o\">=</span> inlineformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> Book<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;title&#39;</span><span class=\"p\">,),</span>\n<span class=\"gp\">... </span>    formset<span class=\"o\">=</span>CustomInlineFormSet<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>author <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Mike Royko&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>formset <span class=\"o\">=</span> BookFormSet<span class=\"p\">(</span>instance<span class=\"o\">=</span>author<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\">fk_name</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=\"nc\">Friendship</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    from_friend <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        Friend<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n        related_name<span class=\"o\">=</span><span class=\"s1\">&#39;from_friends&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    to_friend <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        Friend<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n        related_name<span class=\"o\">=</span><span class=\"s1\">&#39;friends&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    length_in_months <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n</code></pre></div>\n<p>これを解決するには、  <code class=\"docutils literal notranslate\">fk_name</code> を  <a class=\"reference internal\" href=\"/ja/2.2/ref/forms/models/#django.forms.models.inlineformset_factory\" title=\"django.forms.models.inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">inlineformset_factory()</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>FriendshipFormSet <span class=\"o\">=</span> inlineformset_factory<span class=\"p\">(</span>Friend<span class=\"p\">,</span> Friendship<span class=\"p\">,</span> fk_name<span class=\"o\">=</span><span class=\"s1\">&#39;from_friend&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    fields<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=\"nf\">manage_books</span><span class=\"p\">(</span>request<span class=\"p\">,</span> author_id<span class=\"p\">):</span>\n    author <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span>author_id<span class=\"p\">)</span>\n    BookInlineFormSet <span class=\"o\">=</span> inlineformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> Book<span class=\"p\">,</span> fields<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> request<span class=\"o\">.</span>method <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        formset <span class=\"o\">=</span> BookInlineFormSet<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> request<span class=\"o\">.</span>FILES<span class=\"p\">,</span> instance<span class=\"o\">=</span>author<span class=\"p\">)</span>\n        <span class=\"k\">if</span> formset<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            formset<span class=\"o\">.</span>save<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> HttpResponseRedirect<span class=\"p\">(</span>author<span class=\"o\">.</span>get_absolute_url<span class=\"p\">())</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        formset <span class=\"o\">=</span> BookInlineFormSet<span class=\"p\">(</span>instance<span class=\"o\">=</span>author<span class=\"p\">)</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<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> formset<span class=\"p\">})</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">POST</code> と <code class=\"docutils literal notranslate\">GET</code> いずれにおいても <code class=\"docutils literal notranslate\">instance</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\">inlineformset_factory</code> は <code class=\"docutils literal notranslate\">modelformset_factory</code> を使っており、多くの引数は <code class=\"docutils literal notranslate\">modelformset_factory</code> に渡されます。これは <code class=\"docutils literal notranslate\">modelformset_factory</code> と同様に、 <code class=\"docutils literal notranslate\">widgets</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":"clean() メソッドをオーバーライドする","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":"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/2.2/topics/"},{"docname":"topics/forms/index","title":"フォームを使う","url":"/ja/2.2/topics/forms/"}],"prev":{"docname":"topics/forms/formsets","title":"フォームセット (Formset)","url":"/ja/2.2/topics/forms/formsets/"},"next":{"docname":"topics/forms/media","title":"フォームアセット (Media クラス)","url":"/ja/2.2/topics/forms/media/"},"formats":{"html":"/ja/2.2/topics/forms/modelforms/","markdown":"/ja/2.2/topics/forms/modelforms.md","json":"/ja/2.2/topics/forms/modelforms.json"},"source":"https://github.com/django/django/blob/stable/2.2.x/docs/topics/forms/modelforms.txt","official":"https://docs.djangoproject.com/ja/2.2/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","pt-br","ko","es","el","pl"]}