{"title":"モデルからフォームを作成する","version":"5.0","locale":"ja","docname":"topics/forms/modelforms","url":"/ja/5.0/topics/forms/modelforms/","canonical":"https://djangodocs.dev/ja/5.0/topics/forms/modelforms/","summary":"ModelForm Link to this heading # class ModelForm Link to this definition # データベース中心のアプリケーションを作成している場合、Django モデルに密接にマップするフォームを使うことになるでしょう。例えば、 BlogComment…","html":"<h1>モデルからフォームを作成する<a class=\"heading-anchor\" href=\"#creating-forms-from-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"modelform\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code><a class=\"heading-anchor\" href=\"#modelform\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelForm\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">ModelForm</span></span><a class=\"heading-anchor\" href=\"#django.forms.ModelForm\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>データベース中心のアプリケーションを作成している場合、Django モデルに密接にマップするフォームを使うことになるでしょう。例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">BlogComment</span></code> モデルを持っていて、閲覧者がコメントを送信できるフォームを作成したくなったとしましょう。この場合、すでにモデル内にフィールドが定義されているので、フォーム内にフィールドタイプを改めて定義するのは冗長でしょう。</p>\n<p>このためDjango には、Django モデルから <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> クラスを生成できるようなヘルパークラスを用意してあります。</p>\n<p>例えば次のようにします:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ModelForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span>\n\n<span class=\"go\"># Create the form class.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Article</span>\n<span class=\"gp\">... </span>        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;content&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;reporter&quot;</span><span class=\"p\">]</span>\n<span class=\"gp\">...</span>\n\n<span class=\"go\"># Creating a form to add an article.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">ArticleForm</span><span class=\"p\">()</span>\n\n<span class=\"go\"># Creating a form to change an existing article.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">article</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">article</span><span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"field-types\">\n<h3>フィールドの型<a class=\"heading-anchor\" href=\"#field-types\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>生成された <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> クラスは、指定された全てのモデルフィールドに対して、<code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> 属性で指定された順番でフォームフィールドを有します。</p>\n<p>各モデルフィールドは、対応するデフォルトのフォームフィールドを持ちます。例えば、モデル上の <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code>  はフォーム上で <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code> として表現されます。モデル <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">MultipleChoiceField</span></code> として表現されます。 以下は、各フィールドの対応表です:</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>モデルフィールド</p></th>\n<th class=\"head\"><p>フォームフィールド</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AutoField</span></code></a></p></td>\n<td><p>フォーム上では表示されません。</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.BigAutoField\" title=\"django.db.models.BigAutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BigAutoField</span></code></a></p></td>\n<td><p>フォーム上では表示されません。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.BigIntegerField\" title=\"django.db.models.BigIntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BigIntegerField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a> で <code class=\"docutils literal notranslate\"><span class=\"pre\">min_value</span></code> が -9223372036854775808 から <code class=\"docutils literal notranslate\"><span class=\"pre\">max_value</span></code> に 9223372036854775807 セットされます。</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.BinaryField\" title=\"django.db.models.BinaryField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BinaryField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">editable</span></code></a> がモデルフィールド上で <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> にセットされていた場合、<a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> です。それ以外の場合フォーム内で描画されません。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.BooleanField\" title=\"django.db.models.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BooleanField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.BooleanField\" title=\"django.forms.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BooleanField</span></code></a> です。<code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code> の場合は <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.NullBooleanField\" title=\"django.forms.NullBooleanField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">NullBooleanField</span></code></a> です。</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> で、<code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> はモデルフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> にセットされます。また <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code> の場合 <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.CharField.empty_value\" title=\"django.forms.CharField.empty_value\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">empty_value</span></code></a> が <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> にセットされます。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.DateField\" title=\"django.forms.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.DateTimeField\" title=\"django.forms.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.DecimalField\" title=\"django.db.models.DecimalField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DecimalField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.DecimalField\" title=\"django.forms.DecimalField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DecimalField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.DurationField\" title=\"django.db.models.DurationField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DurationField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.DurationField\" title=\"django.forms.DurationField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DurationField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.EmailField\" title=\"django.db.models.EmailField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.EmailField\" title=\"django.forms.EmailField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">EmailField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.FilePathField\" title=\"django.db.models.FilePathField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FilePathField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.FilePathField\" title=\"django.forms.FilePathField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FilePathField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.FloatField\" title=\"django.db.models.FloatField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FloatField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.FloatField\" title=\"django.forms.FloatField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FloatField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.ModelChoiceField\" title=\"django.forms.ModelChoiceField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelChoiceField</span></code></a>\n(see below)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.ImageField\" title=\"django.db.models.ImageField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ImageField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.ImageField\" title=\"django.forms.ImageField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ImageField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.IntegerField\" title=\"django.db.models.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">IPAddressField</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">IPAddressField</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.GenericIPAddressField\" title=\"django.db.models.GenericIPAddressField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericIPAddressField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.GenericIPAddressField\" title=\"django.forms.GenericIPAddressField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericIPAddressField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JSONField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.JSONField\" title=\"django.forms.JSONField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JSONField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.ModelMultipleChoiceField\" title=\"django.forms.ModelMultipleChoiceField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelMultipleChoiceField</span></code></a> (以下を参照)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.PositiveBigIntegerField\" title=\"django.db.models.PositiveBigIntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PositiveBigIntegerField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.PositiveIntegerField\" title=\"django.db.models.PositiveIntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PositiveIntegerField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.PositiveSmallIntegerField\" title=\"django.db.models.PositiveSmallIntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PositiveSmallIntegerField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.SlugField\" title=\"django.db.models.SlugField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SlugField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.SlugField\" title=\"django.forms.SlugField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SlugField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.SmallAutoField\" title=\"django.db.models.SmallAutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SmallAutoField</span></code></a></p></td>\n<td><p>フォーム上では表示されません。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.SmallIntegerField\" title=\"django.db.models.SmallIntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SmallIntegerField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.TextField\" title=\"django.db.models.TextField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TextField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> で <code class=\"docutils literal notranslate\"><span class=\"pre\">widget=forms.Textarea</span></code> です。</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.TimeField\" title=\"django.db.models.TimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TimeField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.TimeField\" title=\"django.forms.TimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TimeField</span></code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.URLField\" title=\"django.db.models.URLField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">URLField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.URLField\" title=\"django.forms.URLField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">URLField</span></code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.UUIDField\" title=\"django.db.models.UUIDField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UUIDField</span></code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.UUIDField\" title=\"django.forms.UUIDField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UUIDField</span></code></a></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>お気付きかもしれませんが、 <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> の 2 つのモデルフィールドは特殊なケースとなります:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">django.forms.ModelChoiceField</span></code> によって表現され、モデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> を選択肢として持つ <code class=\"docutils literal notranslate\"><span class=\"pre\">ChoiceField</span></code> です。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">django.forms.ModelMultipleChoiceField</span></code> によって表現され、モデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> を選択肢として持つ <code class=\"docutils literal notranslate\"><span class=\"pre\">MultipleChoiceField</span></code> です。</p></li>\n</ul>\n<p>加えて、生成されたフォームフィールドはそれぞれ以下の通り属性がセットされます:</p>\n<ul class=\"simple\">\n<li><p>モデルフィールドに <code class=\"docutils literal notranslate\"><span class=\"pre\">blank=True</span></code> が設定されている場合、フォームフィールド上で <code class=\"docutils literal notranslate\"><span class=\"pre\">required</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> にセットされます。それ以外の場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">required=True</span></code> となります。</p></li>\n<li><p>フォームフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">label</span></code> はモデルフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code> の最初の文字を大文字にしたものがセットされます。</p></li>\n<li><p>フォームフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">help_text</span></code> はモデルフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">help_text</span></code> がセットされます。</p></li>\n<li><p>モデルフィールドに <code class=\"docutils literal notranslate\"><span class=\"pre\">choices</span></code> が設定されている場合、フォームフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">widget</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">Select</span></code> にセットされ、選択肢にはモデルフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">choices</span></code> が使われます。通常、選択肢には空欄の選択肢が追加され、デフォルトで選択されることになります。フィールドが required の場合、ユーザは選択肢を選ぶ必要があります。モデルフィールドに <code class=\"docutils literal notranslate\"><span class=\"pre\">blank=False</span></code> および明示的な <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> 値が設定されている場合、空欄の選択肢は表示されません (代わりに <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> 値が選択された状態で表示されます) 。</p></li>\n</ul>\n<p>与えられたモデルフィールドに対して使われるフォームフィールドをオーバーライドすることもできます。後述の <a class=\"reference internal\" href=\"#overriding-the-default-fields\">Overriding the default fields</a> を参照してください。</p>\n</section>\n<section id=\"a-full-example\">\n<h3>完全な具体例<a class=\"heading-anchor\" href=\"#a-full-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>以下のような一連のモデルを考えていきましょう:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ModelForm</span>\n\n<span class=\"n\">TITLE_CHOICES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;MR&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Mr.&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;MRS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Mrs.&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;MS&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Ms.&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Author</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"n\">TITLE_CHOICES</span><span class=\"p\">)</span>\n    <span class=\"n\">birth_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">(</span><span class=\"n\">blank</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">null</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">authors</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;birth_date&quot;</span><span class=\"p\">]</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BookForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Book</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>これらのモデルでは、上記の <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> サブクラスはおおむね以下と同等と言えます (唯一の違いは <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> メソッドで、これからすぐ説明します):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span>\n        <span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">,</span>\n        <span class=\"n\">widget</span><span class=\"o\">=</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Select</span><span class=\"p\">(</span><span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"n\">TITLE_CHOICES</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">birth_date</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">(</span><span class=\"n\">required</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BookForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">authors</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ModelMultipleChoiceField</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">())</span>\n</code></pre></div>\n</section>\n<section id=\"validation-on-a-modelform\">\n<span id=\"validation-on-modelform\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> の検証 (バリデーション)<a class=\"heading-anchor\" href=\"#validation-on-a-modelform\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> のバリデーションには、以下の 2 つのステップが存在します:</p>\n<ol class=\"arabic simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/validation/\"><span class=\"doc\">フォームのバリデーションを実施する</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルのインスタンスのバリデーションを実施する</span></a></p></li>\n</ol>\n<p>通常のフォームのバリデーションと同じように、モデルフォームのバリデーションは <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/api/#django.forms.Form.is_valid\" title=\"django.forms.Form.is_valid\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">is_valid()</span></code></a> が呼ばれたときや <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/api/#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">errors</span></code></a> 属性にアクセスしたとき、暗黙的に実行されます。また、実際にはあまり使うメソッドではありませんが、明示的に <code class=\"docutils literal notranslate\"><span class=\"pre\">full_clean()</span></code> を呼んだときにもバリデーションが実行されます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Model</span></code> バリデーション (<a class=\"reference internal\" href=\"/ja/5.0/ref/models/instances/#django.db.models.Model.full_clean\" title=\"django.db.models.Model.full_clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.full_clean()</span></code></a>) は、フォームバリデーションのステップ内でフォームの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドが呼ばれたすぐ直後に実行されます。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>クリーニングのプロセスは、様々な方法で <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> コンストラクタに渡されたモデルのインスタンスを修正します。例えば、モデル上のあらゆる日付フィールドは、実際の date オブジェクトに変換されます。失敗したバリデーションは、一貫性のない状態でモデルインスタンスを元のままにしておくため、これを再利用するのはお勧めできません。</p>\n</aside>\n<section id=\"overriding-the-clean-method\">\n<span id=\"overriding-modelform-clean-method\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドをオーバーライドする<a class=\"heading-anchor\" href=\"#overriding-the-clean-method\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>通常のフォームと同じ方法でモデルフォーム上の <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドをオーバーライドして、バリデーションの動作を追加できます。</p>\n<p>モデルのオブジェクトに付属したモデルフォームのインスタンスは、<code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code> 属性を持ち、メソッドが特定のモデルのインスタンスにアクセスできるようにします。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm.clean()</span></code> メソッドは、<a class=\"reference internal\" href=\"/ja/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルバリデーション</span></a> に、<code class=\"docutils literal notranslate\"><span class=\"pre\">unique</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_for_date|month|year</span></code> としてマークされたモデルフィールドの一意性を検証させます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドをオーバーライドして、なおかつこのバリデーションを維持したい場合、親クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドを呼ぶ必要があります。</p>\n</aside>\n</section>\n<section id=\"interaction-with-model-validation\">\n<h4>モデルバリデーションとのやり取り<a class=\"heading-anchor\" href=\"#interaction-with-model-validation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>バリデーションプロセスの一部として、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> フォーム上で対応するフィールドを持つモデルのそれぞれのフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドを呼び出します。モデルフィールドを除外した場合、これらのフィールドに対してはバリデーションが実行されません。フィールドのクリーニングとバリデーションの詳しい働き方については、<a class=\"reference internal\" href=\"/ja/5.0/ref/forms/validation/\"><span class=\"doc\">フォームバリデーション</span></a> ドキュメントを参照してください。</p>\n<p>モデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドは一意性のチェックがされる前に呼び出されます。モデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> フックのより詳しい情報については、<a class=\"reference internal\" href=\"/ja/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">オブジェクトのバリデーションを行う</span></a> を参照してください。</p>\n</section>\n<section id=\"considerations-regarding-model-s-error-messages\">\n<span id=\"considerations-regarding-model-errormessages\"></span><h4>モデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">error_messages</span></code> のレンダリングを考える<a class=\"heading-anchor\" href=\"#considerations-regarding-model-s-error-messages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/#django.forms.Field.error_messages\" title=\"django.forms.Field.error_messages\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">フォームフィールド</span></code></a> や <a class=\"reference internal\" href=\"#modelforms-overriding-default-fields\"><span class=\"std std-ref\">フォーム Meta</span></a> のレベルで定義されたエラーメッセージは、常に <a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.Field.error_messages\" title=\"django.db.models.Field.error_messages\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">モデルフィールド</span></code></a> のレベルで定義されたエラーメッセージより優先されます。</p>\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.Field.error_messages\" title=\"django.db.models.Field.error_messages\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">モデルフィールド</span></code></a> で定義されたエラーメッセージは、<a class=\"reference internal\" href=\"/ja/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルバリデーション</span></a> のステップの間に <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> が発生したときに、対応するエラーメッセージがフォームのレベルで定義されていない場合にのみ使用されます。</p>\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/exceptions/#django.core.exceptions.NON_FIELD_ERRORS\" title=\"django.core.exceptions.NON_FIELD_ERRORS\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">NON_FIELD_ERRORS</span></code></a> キーを <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラス内の <code class=\"docutils literal notranslate\"><span class=\"pre\">error_messages</span></code> ディクショナリに追加することで、モデルバリデーションによって発生する <code class=\"docutils literal notranslate\"><span class=\"pre\">NON_FIELD_ERRORS</span></code> に対するエラーメッセージをオーバーライドできます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">NON_FIELD_ERRORS</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ModelForm</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">error_messages</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"n\">NON_FIELD_ERRORS</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;unique_together&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">%(model_name)s</span><span class=\"s2\">&#39;s </span><span class=\"si\">%(field_labels)s</span><span class=\"s2\"> are not unique.&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">}</span>\n        <span class=\"p\">}</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"the-save-method\">\n<span id=\"topics-modelform-save\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> メソッド<a class=\"heading-anchor\" href=\"#the-save-method\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>全ての <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> メソッドも持っています。このメソッドは、フォームに結びつけられたデータからデータベースオブジェクトを生成して保存します。<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> のサブクラスはキーワード引数 <code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code> として既存のモデルインスタンスを受け取ることができます; これが指定されると、<code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> はそのインスタンスを更新するようになります。 指定されない場合は、<code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> は指定されたモデルの新しいインスタンスを生成します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ArticleForm</span>\n\n<span class=\"go\"># Create a form instance from POST data.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Save a new Article object from the form&#39;s data.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">new_article</span> <span class=\"o\">=</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"go\"># Create a form to edit an existing Article, but use</span>\n<span class=\"go\"># POST data to populate the form.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">a</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>フォームが <a class=\"reference internal\" href=\"#validation-on-modelform\"><span class=\"std std-ref\">バリデーションされていない</span></a> 場合、<code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> を呼び出すと、<code class=\"docutils literal notranslate\"><span class=\"pre\">form.errors</span></code> をチェックすることでこれを行います。フォーム内のデータが適正ではない場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">ValueError</span></code> が発生します -- 例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">form.errors</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> だと評価された場合です。</p>\n<p>オプションのフィールドがフォームのデータに表示されない場合、結果のモデルインスタンスはモデルフィールドの <a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">default</span></code></a> を使用します。この動作は、 <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/widgets/#django.forms.CheckboxInput\" title=\"django.forms.CheckboxInput\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CheckboxInput</span></code></a>, <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/widgets/#django.forms.CheckboxSelectMultiple\" title=\"django.forms.CheckboxSelectMultiple\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CheckboxSelectMultiple</span></code></a>, または <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/widgets/#django.forms.SelectMultiple\" title=\"django.forms.SelectMultiple\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SelectMultiple</span></code></a> (または <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/widgets/#django.forms.Widget.value_omitted_from_data\" title=\"django.forms.Widget.value_omitted_from_data\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">value_omitted_from_data()</span></code></a> メソッドが常に <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> を返すカスタムウィジェット) を使用するフィールドには適用されません。チェックされていないチェックボックスと、選択されていない <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;select</span> <span class=\"pre\">multiple&gt;</span></code> は HTML フォーム送信のデータには表示されないからです。 API を設計していて、これらのウィジェットを使用するフィールドのデフォルトのフォールバック動作が必要な場合は、カスタムフォームフィールドまたはウィジェットを使用します。</p>\n<p>この <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> には、省略可能な <code class=\"docutils literal notranslate\"><span class=\"pre\">commit</span></code> キーワード引数があり、<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> ないし <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> を取ります。<code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> を <code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code> で呼び出した場合、データベースにまだ保存されていないオブジェクトを返します。この場合、結果のモデルインスタンスで <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> を呼び出すかどうかはあなた次第です。これは、保存前にオブジェクトで独自のプロセスを実行したい場合、もしくは特別な <a class=\"reference internal\" href=\"/ja/5.0/ref/models/instances/#ref-models-force-insert\"><span class=\"std std-ref\">モデル保存オプション</span></a> を使いたい場合に有用です。 <code class=\"docutils literal notranslate\"><span class=\"pre\">commit</span></code> はデフォルトでは <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> です。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code> を使う際のもう 1 つの副作用は、モデルに他のモデルとの多対多の関係がある場合に見られます。フォームを save するときにモデルに多対多の関係があり <code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code> を指定した場合、Django は多対多の関係に対してフォームのデータを即座に保存することができません。これは、インスタンスがデータベース上に存在するようになるまで、インスタンスに対して多対多のデータを保存することが不可能だからです。</p>\n<p>この問題を扱うために、<code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code> を使ったフォームを save するたびに、Django は <code class=\"docutils literal notranslate\"><span class=\"pre\">save_m2m()</span></code> メソッドをあなたの <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> サブクラスに追加します。フォームによって生成されたインスタンスを手動で save した後に、多対多のフォームデータを保存するには <code class=\"docutils literal notranslate\"><span class=\"pre\">save_m2m()</span></code> を実行します。例えば:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"go\"># Create a form instance with POST data.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Create, but don&#39;t save the new author instance.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">new_author</span> <span class=\"o\">=</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">commit</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Modify the author in some way.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">new_author</span><span class=\"o\">.</span><span class=\"n\">some_field</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;some_value&quot;</span>\n\n<span class=\"go\"># Save the new instance.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">new_author</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"go\"># Now, save the many-to-many data for the form.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">save_m2m</span><span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">save_m2m()</span></code> を呼び出す必要があるのは <code class=\"docutils literal notranslate\"><span class=\"pre\">save(commit=False)</span></code> を使ったときだけです。フォーム上で <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> を使用すると、多対多のデータを含むすべてのデータが保存されます。 たとえば:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"go\"># Create a form instance with POST data.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">a</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Create and save the new author instance. There&#39;s no need to do anything else.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">new_author</span> <span class=\"o\">=</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">save_m2m()</span></code> メソッドのほかは、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">forms</span></code> のフォームとまったく同じ方法で動作します。例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">is_valid()</span></code> メソッドは妥当性をチェックするために使用される、<code class=\"docutils literal notranslate\"><span class=\"pre\">is_multipart()</span></code> メソッドはフォームがマルチパートのファイルアップロードを必要とするかどうかを (ゆえに <code class=\"docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code> がフォームに渡される必要があるかどうかも) 決める、などです。詳しくは <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/api/#binding-uploaded-files\"><span class=\"std std-ref\">アップロードされたファイルをフォームにバインドする</span></a> を参照してください。</p>\n</section>\n<section id=\"selecting-the-fields-to-use\">\n<span id=\"modelforms-selecting-fields\"></span><h3>使うフィールドを選択する<a class=\"heading-anchor\" href=\"#selecting-the-fields-to-use\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> 属性を使って、フォームで編集すべき全てのフィールドを明示的に指定することを強くお勧めします。そうしないと、フォームで予期せず特定のフィールドを設定できるようになり、セキュリティ上の問題が発生しやすくなります。特に新しいフィールドがモデルに追加されたときに起こりがちです。フォームのレンダリング方法によっては、Webページで問題が目に見えないことさえあります。</p>\n<p>別のアプローチとしては、すべてのフィールドを自動的に含めるか、一部のフィールドだけを削除する方法があります。この基本的なアプローチは安全性がかなり低いことが知られており、主要なウェブサイトで深刻な悪用が行われています (<a class=\"reference external\" href=\"https://github.blog/2012-03-04-public-key-security-vulnerability-and-mitigation/\">GitHub</a> など)。</p>\n<p>しかし、これらのセキュリティ上の懸念があなたに当てはまらないと保証できる場合には、2 つのショートカットが利用可能です:</p>\n<ol class=\"arabic\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> 属性に、特殊な値 <code class=\"docutils literal notranslate\"><span class=\"pre\">'__all__'</span></code> をセットして、モデル内の全てのフィールドが使われるように指定します。例えば:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ModelForm</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;__all__&quot;</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> の中の <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude</span></code> 属性に、フォームから除外されるフィールドのリストをセットします。</p>\n<p>例:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PartialAuthorForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n        <span class=\"n\">exclude</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> モデルは 3 つのフィールド <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">birth_date</span></code> を持っているため、これで <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">birth_date</span></code> がフォームに表示されることになります。</p>\n</li>\n</ol>\n<p>このどちらかが使われた場合、フォーム内で表示されるフィールドの順番はモデル内でフィールドが定義された順番となり、<code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> インスタンスは最後に表示されます。</p>\n<p>加えて、Django は以下のルールも適用します: モデルフィールドで <code class=\"docutils literal notranslate\"><span class=\"pre\">editable=False</span></code> をセットした場合、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> を通じて生成された <em>全ての</em> フォームはそのフィールドを含みません。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>上記のロジックでフォームに含まれない全てのフィールドは、フォームの <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> メソッドでセットされません。また、除外したフィールドを手動でフォームに追加し直した場合、モデルインスタンスから初期化されることはありません。</p>\n<p>Django は不完全なモデルを保存しないようにするため、モデルの設定でフィールドを空にすることを許容しておらず、かつ除外されたフィールドに対するデフォルト値を指定しなかった場合、除外されたフィールドを含む <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> を <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> しようとすると失敗します。この失敗を避けるには、除外する必須フィールドに初期値を指定してモデルをインスタンス化する必要があります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Mr&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">PartialAuthorForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">author</span><span class=\"p\">)</span>\n<span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>もしくは、<code class=\"docutils literal notranslate\"><span class=\"pre\">save(commit=False)</span></code> を使って手動で追加の必須フィールドをセットできます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">PartialAuthorForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">)</span>\n<span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">commit</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"n\">author</span><span class=\"o\">.</span><span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Mr&quot;</span>\n<span class=\"n\">author</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">save(commit=False)</span></code> の使用について、詳しくは <a class=\"reference internal\" href=\"#the-save-method\">section on saving forms</a> を参照してください。</p>\n</aside>\n</section>\n<section id=\"overriding-the-default-fields\">\n<span id=\"modelforms-overriding-default-fields\"></span><h3>デフォルトのフィールドをオーバライドする<a class=\"heading-anchor\" href=\"#overriding-the-default-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>前述の <a class=\"reference internal\" href=\"#field-types\">Field types</a> テーブルで説明したとおり、デフォルトのフィールドタイプは実用的なデフォルトです。モデルに <code class=\"docutils literal notranslate\"><span class=\"pre\">DateField</span></code> がある場合、フォーム内で <code class=\"docutils literal notranslate\"><span class=\"pre\">DateField</span></code> として表示したいことでしょう。しかし、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> では、与えられたモデルに足してフォームフィールドを変更する柔軟性があります。</p>\n<p>フィールドに対して独自のウィジェットを指定するには、内部の <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> を使用してください。これは、フィールド名としジェットのクラスやインスタンスをマッピングするディクショナリです。</p>\n<p>例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">Authoer</span></code> の <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> 属性に対する <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code> を、デフォルトの <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;input</span> <span class=\"pre\">type=&quot;text&quot;&gt;</span></code> の代わりに <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;textarea&gt;</span></code> で表示したい場合、フィールドのウィジェットをオーバーライドします:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ModelForm</span><span class=\"p\">,</span> <span class=\"n\">Textarea</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;birth_date&quot;</span><span class=\"p\">]</span>\n        <span class=\"n\">widgets</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"n\">Textarea</span><span class=\"p\">(</span><span class=\"n\">attrs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;cols&quot;</span><span class=\"p\">:</span> <span class=\"mi\">80</span><span class=\"p\">,</span> <span class=\"s2\">&quot;rows&quot;</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><code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> 辞書はウィジェットのインスタンス（例: <code class=\"docutils literal notranslate\"><span class=\"pre\">Textarea(...)</span></code> ）またはクラス（例: <code class=\"docutils literal notranslate\"><span class=\"pre\">Textarea</span></code>）を受け付けます。空でない <code class=\"docutils literal notranslate\"><span class=\"pre\">choices</span></code> 属性を持つモデルフィールドでは <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> 辞書は無視されることに注意してください。この場合、フォームフィールドをオーバーライドして別のウィジェットを使用する必要があります。</p>\n<p>同様に、フィールドをさらにカスタマイズしたい場合、内部の <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">labels</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">help_texts</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">error_messages</span></code> と言った属性を指定できます。</p>\n<p>例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> フィールドに対する文字列に直面する全てのユーザの文章をカスタマイズしたい場合:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;birth_date&quot;</span><span class=\"p\">]</span>\n        <span class=\"n\">labels</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Writer&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">}</span>\n        <span class=\"n\">help_texts</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Some useful help text.&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">}</span>\n        <span class=\"n\">error_messages</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;max_length&quot;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;This writer&#39;s name is too long.&quot;</span><span class=\"p\">),</span>\n            <span class=\"p\">},</span>\n        <span class=\"p\">}</span>\n</code></pre></div>\n<p>また、 <code class=\"docutils literal notranslate\"><span class=\"pre\">field_classes</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">formfield_callback</span></code> を指定して、フォームがインスタンス化するフィールドのタイプをカスタマイズすることもできます。</p>\n<p>例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">slug</span></code> フィールドに対して <code class=\"docutils literal notranslate\"><span class=\"pre\">MySlugFormField</span></code> を使いたい場合、以下のようにできます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ModelForm</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Article</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;content&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;reporter&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">]</span>\n        <span class=\"n\">field_classes</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">:</span> <span class=\"n\">MySlugFormField</span><span class=\"p\">,</span>\n        <span class=\"p\">}</span>\n</code></pre></div>\n<p>もしくは:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ModelForm</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">formfield_for_dbfield</span><span class=\"p\">(</span><span class=\"n\">db_field</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">db_field</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">MySlugFormField</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">db_field</span><span class=\"o\">.</span><span class=\"n\">formfield</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Article</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;content&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;reporter&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">]</span>\n        <span class=\"n\">formfield_callback</span> <span class=\"o\">=</span> <span class=\"n\">formfield_for_dbfield</span>\n</code></pre></div>\n<p>最後に、フィールドを完全に -- タイプ、バリデータ、必須かどうかなどを含めて -- コントロールしたい場合、通常の <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> で行うのと同じようにフィールドを宣言的に指定することで実現できます。</p>\n<p>フィールドのバリデータを指定したい場合、フィールドを宣言的に定義して <code class=\"docutils literal notranslate\"><span class=\"pre\">validators</span></code> パラメータを設定することで実現できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CharField</span><span class=\"p\">,</span> <span class=\"n\">ModelForm</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"n\">slug</span> <span class=\"o\">=</span> <span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">validators</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">validate_slug</span><span class=\"p\">])</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Article</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;content&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;reporter&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>以下のように明示的にフォームフィールドをインスタンス化したとき、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> と 通常の <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> が連動する方法を理解することが重要となります。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> は、特定のフィールドを自動的に生成できる通常の <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> です。自動的に生成されるフィールドは、<code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの内容とどのフィールドが宣言的に定義されているかに依存します。基本的に、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> は フォームから <strong>除外された</strong> フィールド、言い換えると宣言的に定義されなかったフィールド <strong>のみ</strong> を生成します。</p>\n<p>宣言的に定義されたフィールドはそのままになります。したがって、<code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> 属性に対するカスタマイズ、例えば <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">labels</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">help_texts</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">error_messages</span></code> は無視されます; これらは自動的に生成されたフィールドにのみ適用されます。</p>\n<p>同様に、宣言的に定義されたフィールドは、対応するモデルから引き継がれた <code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">required</span></code> のような属性を描画しません。モデル内で定義された動作を引き継ぎたい場合は、フォームフィールドを宣言する際に明示的に関連する属性をセットする必要があります。</p>\n<p>例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">Article</span></code> モデルは以下のようになります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span>\n        <span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">,</span>\n        <span class=\"n\">null</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"n\">blank</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"n\">help_text</span><span class=\"o\">=</span><span class=\"s2\">&quot;Use puns liberally&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">content</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>そして、指定されたとおりに <code class=\"docutils literal notranslate\"><span class=\"pre\">blank</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">help_text</span></code> が維持されている一方で、<code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code> に対して独自のバリデーションを実施するために、<code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleForm</span></code> を以下のように定義します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"n\">MyFormField</span><span class=\"p\">(</span>\n        <span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">,</span>\n        <span class=\"n\">required</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"n\">help_text</span><span class=\"o\">=</span><span class=\"s2\">&quot;Use puns liberally&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Article</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;content&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>フォームフィールドのタイプを使用して、対応するモデルフィールドの内容を設定できることを確認する必要があります。 互換性がない場合、暗黙的な変換が行われないので、 &quot;ValueError&quot; を取得します。</p>\n<p>フィールドとその属性について、詳しくは <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/fields/\"><span class=\"doc\">フォームフィールドのドキュメンテーション</span></a> を参照してください。</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"4.2\">\n<p class=\"version-note-title\">Changed in Django 4.2</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.formfield_callback</span></code> 属性が追加されました。</p>\n</aside>\n</section>\n<section id=\"enabling-localization-of-fields\">\n<h3>フィールドのローカライズを有効にする<a class=\"heading-anchor\" href=\"#enabling-localization-of-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>デフォルトでは、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> 内のフィールドはデータをローカライズしません。フィールドのデータをローカライズするには、<code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code> 属性が使用できます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ModelForm</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n<span class=\"gp\">... </span>        <span class=\"n\">localized_fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code> が特殊な値 <code class=\"docutils literal notranslate\"><span class=\"pre\">'__all__'</span></code> にセットされた場合、全てのフィールドがローカライズされます。</p>\n</section>\n<section id=\"form-inheritance\">\n<h3>フォームの継承<a class=\"heading-anchor\" href=\"#form-inheritance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>基本的なフォームと同様に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForms</span></code> を継承して拡張したり再利用したりすることができます。これは、モデルから派生した多くのフォームで使用するために、親クラスに追加フィールドや追加メソッドを宣言する必要がある場合に便利です。たとえば、以前の <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleForm</span></code> クラスを使います:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">EnhancedArticleForm</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean_pub_date</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n<span class=\"gp\">...</span>\n</code></pre></div>\n<p>これは <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleForm</span></code> と同じように動作するフォームを作成しますが、<code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> フィールドのバリデーションとクリーニングが追加されます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.fields</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.exclude</span></code> のリストを変更したい場合は、親の <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> インナークラスをサブクラス化することもできます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">RestrictedArticleForm</span><span class=\"p\">(</span><span class=\"n\">EnhancedArticleForm</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">(</span><span class=\"n\">ArticleForm</span><span class=\"o\">.</span><span class=\"n\">Meta</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>        <span class=\"n\">exclude</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">]</span>\n<span class=\"gp\">...</span>\n</code></pre></div>\n<p>これは <code class=\"docutils literal notranslate\"><span class=\"pre\">EnhancedArticleForm</span></code> からの追加メソッドを追加し、1つのフィールドを削除するようにオリジナルの <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleForm.Meta</span></code> を修正します。</p>\n<p>ただ、注意すべき点がいくつかあります。</p>\n<ul>\n<li><p>通常の Python の名前解決ルールが適用されます。内部クラス <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> を宣言している基底クラスが複数ある場合、最初のものだけが使用されます。つまり、子クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> が存在する場合はそれが使用され、そうでない場合は最初の親の <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> などが使用されます。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> の両方から同時に継承することは可能ですが、必ず <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> が MRO (Method Resolution Order) の中で最初に現れるようにする必要があります。なぜなら、これらのクラスは異なるメタクラスに依存しており、一つのクラスは一つのメタクラスしか持つことができないからです。</p></li>\n<li><p>親クラスから継承した <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> を宣言的に削除するには、サブクラスで名前を <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> に設定します。</p>\n<p>このテクニックを使用できるのは、親クラスによって宣言的に定義されたフィールドからオプトアウトする場合のみです。 <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> メタクラスがデフォルトフィールドを生成するのを防ぐことはできません。デフォルトのフィールドからオプトアウトするには、 <a class=\"reference internal\" href=\"#modelforms-selecting-fields\"><span class=\"std std-ref\">使うフィールドを選択する</span></a> を参照してください。</p>\n</li>\n</ul>\n</section>\n<section id=\"providing-initial-values\">\n<h3>初期値を指定する<a class=\"heading-anchor\" href=\"#providing-initial-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>通常のフォームと同様に、フォームのインスタンスを作成する際に <code class=\"docutils literal notranslate\"><span class=\"pre\">initial</span></code> パラメータを指定することで、フォームの初期データを指定できます。この方法で指定された初期値は、フォームフィールドからの初期値と、アタッチされたモデルインスタンスからの値の両方を上書きします。たとえば、下記のようにします:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">article</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">article</span><span class=\"o\">.</span><span class=\"n\">headline</span>\n<span class=\"go\">&#39;My headline&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">ArticleForm</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Initial headline&quot;</span><span class=\"p\">},</span> <span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">article</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">form</span><span class=\"p\">[</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">()</span>\n<span class=\"go\">&#39;Initial headline&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"modelform-factory-function\">\n<span id=\"modelforms-factory\"></span><h3>ModelForm factory 関数<a class=\"heading-anchor\" href=\"#modelform-factory-function\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>クラス定義ではなく、スタンドアロン関数 <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/models/#django.forms.models.modelform_factory\" title=\"django.forms.models.modelform_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelform_factory()</span></code></a> を使って、与えられたモデルからフォームを作成することもできます。あまりカスタマイズをしないなら、こちらの方が便利でしょう:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">modelform_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Book</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">BookForm</span> <span class=\"o\">=</span> <span class=\"n\">modelform_factory</span><span class=\"p\">(</span><span class=\"n\">Book</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>これは既存のフォームを修正するためにも使用できます。たとえば、指定されたフィールドに使用するウィジェットを指定できます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Textarea</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Form</span> <span class=\"o\">=</span> <span class=\"n\">modelform_factory</span><span class=\"p\">(</span><span class=\"n\">Book</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"o\">=</span><span class=\"n\">BookForm</span><span class=\"p\">,</span> <span class=\"n\">widgets</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> <span class=\"n\">Textarea</span><span class=\"p\">()})</span>\n</code></pre></div>\n<p>含むフィールドは <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude</span></code> のキーワード引数、もしくは <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> 内部の <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの対応する属性を使って指定できます。<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> <a class=\"reference internal\" href=\"#modelforms-selecting-fields\"><span class=\"std std-ref\">使うフィールドを選択する</span></a> ドキュメントを参照してください。</p>\n<p>... 特定のフィールドのローカライズを有効にすることもできます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Form</span> <span class=\"o\">=</span> <span class=\"n\">modelform_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"o\">=</span><span class=\"n\">AuthorForm</span><span class=\"p\">,</span> <span class=\"n\">localized_fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;birth_date&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"model-formsets\">\n<span id=\"id1\"></span><h2>モデルのフォームセット<a class=\"heading-anchor\" href=\"#model-formsets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">BaseModelFormSet</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><a class=\"reference internal\" href=\"/ja/5.0/topics/forms/formsets/\"><span class=\"doc\">通常のフォームセット</span></a> のように、 Django は Django モデルでの作業をより便利にするために、いくつかの拡張 フォームセットクラスを提供しています。上の <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> モデルを再利用してみましょう:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">modelformset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> を使用すると、フォームセットが指定されたフィールドだけを使うように制限されます。または、除外するフィールドを指定する &quot;オプトアウト&quot; アプローチをとることもできます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">exclude</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;birth_date&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>これは <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> モデルに関連付けられたデータを扱うことができるフォームセットを作成します。通常のフォームセットと同じように動作します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">formset</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;input type=&quot;hidden&quot; name=&quot;form-TOTAL_FORMS&quot; value=&quot;1&quot; id=&quot;id_form-TOTAL_FORMS&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;form-INITIAL_FORMS&quot; value=&quot;0&quot; id=&quot;id_form-INITIAL_FORMS&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;form-MIN_NUM_FORMS&quot; value=&quot;0&quot; id=&quot;id_form-MIN_NUM_FORMS&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;form-MAX_NUM_FORMS&quot; value=&quot;1000&quot; id=&quot;id_form-MAX_NUM_FORMS&quot;&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-name&quot;&gt;Name:&lt;/label&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;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-title&quot;&gt;Title:&lt;/label&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;/div&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/5.0/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelformset_factory()</span></code></a> は <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/formsets/#django.forms.formsets.formset_factory\" title=\"django.forms.formsets.formset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">formset_factory()</span></code></a> を使ってフォームセットを生成します。つまり、モデルのフォームセットは基本フォームセットを拡張したもので、特定のモデルとどのように相互作用するかを知っています。</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><a class=\"reference internal\" href=\"/ja/5.0/topics/db/models/#multi-table-inheritance\"><span class=\"std std-ref\">複数テーブルの継承</span></a> を使用している場合、フォームセットファクトリによって生成されたフォームは <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> フィールドの代わりに親リンクフィールド (デフォルトでは <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;parent_model_name&gt;_ptr</span></code>) を含みます。</p>\n</aside>\n<section id=\"changing-the-queryset\">\n<h3>クエリセットを変更する<a class=\"heading-anchor\" href=\"#changing-the-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>デフォルトでは、モデルからフォームセットを作成する場合、フォームセットはモデル内のすべてのオブジェクトを含むクエリセットを使用します (例 <code class=\"docutils literal notranslate\"><span class=\"pre\">Author.objects.all()</span></code>) 。 <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset</span></code> 引数を使用することで、この動作をオーバーライドできます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;O&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>もしくは、<code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> の中で <code class=\"docutils literal notranslate\"><span class=\"pre\">self.queryset</span></code> をセットするサブクラスを作成できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseModelFormSet</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BaseAuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseModelFormSet</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">queryset</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;O&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>そして、ファクトリ関数に <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseAuthorFormSet</span></code> クラスを渡します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">],</span> <span class=\"n\">formset</span><span class=\"o\">=</span><span class=\"n\">BaseAuthorFormSet</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>既存のモデルのインスタンスを <em>一切</em> 含まないフォームセットを返したい場合は、空の QuerySet を指定します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">none</span><span class=\"p\">())</span>\n</code></pre></div>\n</section>\n<section id=\"changing-the-form\">\n<h3>フォームを変更する<a class=\"heading-anchor\" href=\"#changing-the-form\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>デフォルトでは、 <code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code> を使うと、 <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/models/#django.forms.models.modelform_factory\" title=\"django.forms.models.modelform_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelform_factory()</span></code></a> を使ってモデルフォームが作成されます。多くの場合、カスタムモデルフォームを指定すると便利です。たとえば、カスタムバリデーションを持つカスタムモデルフォームを作成できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># custom validation for the name field</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<p>次に、モデルフォームをファクトリ関数に渡します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"o\">=</span><span class=\"n\">AuthorForm</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>必ずしもカスタムモデルフォームを定義する必要はありません。 <code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code> 関数には <code class=\"docutils literal notranslate\"><span class=\"pre\">modelform_factory</span></code> に渡されるいくつかの引数があります。以下で説明します。</p>\n</section>\n<section id=\"specifying-widgets-to-use-in-the-form-with-widgets\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> を使って、フォームで使用するウィジェットを指定する<a class=\"heading-anchor\" href=\"#specifying-widgets-to-use-in-the-form-with-widgets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>パラメータ <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> を使うことで、特定のフィールドに対して <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> のウィジェットクラスをカスタマイズするための値の辞書を指定できます。これは <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> の内部 <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> 辞書と同じように動作します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Author</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">],</span>\n<span class=\"gp\">... </span>    <span class=\"n\">widgets</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"n\">Textarea</span><span class=\"p\">(</span><span class=\"n\">attrs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;cols&quot;</span><span class=\"p\">:</span> <span class=\"mi\">80</span><span class=\"p\">,</span> <span class=\"s2\">&quot;rows&quot;</span><span class=\"p\">:</span> <span class=\"mi\">20</span><span class=\"p\">})},</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"enabling-localization-for-fields-with-localized-fields\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code> でフィールドのローカライズを有効にする<a class=\"heading-anchor\" href=\"#enabling-localization-for-fields-with-localized-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code> パラメータを使って、フォームのフィールドのローカライズを有効にできます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">],</span>\n<span class=\"gp\">... </span>    <span class=\"n\">localized_fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code> が特殊な値 <code class=\"docutils literal notranslate\"><span class=\"pre\">'__all__'</span></code> にセットされた場合、全てのフィールドがローカライズされます。</p>\n</section>\n<section id=\"id2\">\n<h3>初期値を指定する<a class=\"heading-anchor\" href=\"#id2\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>通常のフォームセットと同様に、 <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelformset_factory()</span></code></a> によって返されるモデルフォームセットクラスをインスタンス化する際に <code class=\"docutils literal notranslate\"><span class=\"pre\">initial</span></code> パラメータを指定することで、 <a class=\"reference internal\" href=\"/ja/5.0/topics/forms/formsets/#formsets-initial-data\"><span class=\"std std-ref\">初期データ</span></a> をフォームセット内のフォームに指定できます。しかし、モデルフォームセットでは、初期値は既存のモデルインスタンスにアタッチされていない余分なフォームにだけ適用されます。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">initial</span></code> の長さが余分なフォームの数を超えた場合、余分な初期データは無視されます。初期データを持つ余分なフォームがユーザーによって変更されなかった場合、それらはバリデーションも保存もされません。</p>\n</section>\n<section id=\"saving-objects-in-the-formset\">\n<span id=\"id3\"></span><h3>フォームセット内のオブジェクトを保存する<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><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> と同様に、データをモデルオブジェクトとして保存できます。これはフォームセットの <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> メソッドで行います:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"go\"># Create a formset instance with POST data.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Assuming all is valid, save the data.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">instances</span> <span class=\"o\">=</span> <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> メソッドはデータベースに保存されたインスタンスを返します。指定したインスタンスのデータがバインドされたデータで変更されなかった場合、そのインスタンスはデータベースに保存されず、戻り値 (上記の例では <code class=\"docutils literal notranslate\"><span class=\"pre\">instances</span></code>) にも含まれません。</p>\n<p>フォームにフィールドがない場合 (例えば除外されている場合など)、これらのフィールドは <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> メソッドではセットされません。通常の <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForms</span></code> にも適用されるこの制限についての詳細は <a class=\"reference internal\" href=\"#selecting-the-fields-to-use\">Selecting the fields to use</a> を参照してください。</p>\n<p>未保存のモデルインスタンスを返すには <code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code> を渡します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"go\"># don&#39;t save to the database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">instances</span> <span class=\"o\">=</span> <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">commit</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">instance</span> <span class=\"ow\">in</span> <span class=\"n\">instances</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"c1\"># do something with instance</span>\n<span class=\"gp\">... </span>    <span class=\"n\">instance</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">...</span>\n</code></pre></div>\n<p>これにより、データベースに保存する前にインスタンスにデータを付加できます。フォームセットに <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> が含まれている場合は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">formset.save_m2m()</span></code> を呼び出して、多対多のリレーションシップが適切に保存されるようにする必要があります。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> を呼び出すと、モデルのフォームセットにはフォームセットの変更を表す3つの新しい属性が追加されます:</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet.changed_objects\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">models.BaseModelFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">changed_objects</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet.changed_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet.deleted_objects\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">models.BaseModelFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">deleted_objects</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet.deleted_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet.new_objects\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">models.BaseModelFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">new_objects</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet.new_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</section>\n<section id=\"limiting-the-number-of-editable-objects\">\n<span id=\"model-formsets-max-num\"></span><h3>編集可能なオブジェクトの数を制限する<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>通常のフォームセットと同様に、 <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelformset_factory()</span></code></a> の <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> パラメータを使って、表示される追加のフォームの数を制限できます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> は既存のオブジェクトが表示されないようにするものではありません:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Author: Charles Baudelaire&gt;, &lt;Author: Paul Verlaine&gt;, &lt;Author: Walt Whitman&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">],</span> <span class=\"n\">max_num</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"p\">[</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">()]</span>\n<span class=\"go\">[&#39;Charles Baudelaire&#39;, &#39;Paul Verlaine&#39;, &#39;Walt Whitman&#39;]</span>\n</code></pre></div>\n<p>また、 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra=0</span></code> は新しいモデルインスタンスの作成を妨げるものではありません。 <a class=\"reference internal\" href=\"/ja/5.0/topics/forms/formsets/#understanding-the-managementform\"><span class=\"std std-ref\">JavaScriptでフォームを追加</span></a> したり、追加のPOSTデータを送信したりすることができます。この方法については <a class=\"reference internal\" href=\"#model-formsets-edit-only\"><span class=\"std std-ref\">新しいオブジェクトの作成を防ぐ</span></a> を参照してください。</p>\n<p>もし <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> の値が既存の関連オブジェクトの数よりも大きい場合、フォームの総数が <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> を超えない限り、最大 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> 個の空白のフォームがフォームセットに追加されます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">],</span> <span class=\"n\">max_num</span><span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"n\">extra</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"n\">formset</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-0-name&quot;&gt;Name:&lt;/label&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;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-1-name&quot;&gt;Name:&lt;/label&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;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-2-name&quot;&gt;Name:&lt;/label&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;/div&gt;</span>\n<span class=\"go\">&lt;div&gt;&lt;label for=&quot;id_form-3-name&quot;&gt;Name:&lt;/label&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;/div&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> の値が <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> (デフォルト) だった場合、表示されるフォームの上限は大きな数になります (1000)。この数は、実際には制限がないと見なせるでしょう。</p>\n</section>\n<section id=\"preventing-new-objects-creation\">\n<span id=\"model-formsets-edit-only\"></span><h3>新しいオブジェクトの作成を防ぐ<a class=\"heading-anchor\" href=\"#preventing-new-objects-creation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">edit_only</span></code> パラメータを使用すると、新しいオブジェクトを作成しないようにすることができます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Author</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">],</span>\n<span class=\"gp\">... </span>    <span class=\"n\">edit_only</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>ここでは、フォームセットは既存の <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> インスタンスのみを編集します。他のオブジェクトは作成も編集もされません。</p>\n</section>\n<section id=\"using-a-model-formset-in-a-view\">\n<h3>ビューでモデルフォームセットを使う<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>モデルのフォームセットはフォームセットにとても似ています。例えば、<code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> モデルのインスタンスを編集するフォームセットを表示したいとしましょう:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">modelformset_factory</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">manage_authors</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">])</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        <span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n            <span class=\"c1\"># do something.</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s2\">&quot;manage_authors.html&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;formset&quot;</span><span class=\"p\">:</span> <span class=\"n\">formset</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>見てのとおり、モデルフォームセットのビューロジックは、「通常の」フォームセットと大きく異なるものではありません。唯一の違いは、 <code class=\"docutils literal notranslate\"><span class=\"pre\">formset.save()</span></code> を呼び出してデータをデータベースに保存できることです。(これは上記の <a class=\"reference internal\" href=\"#saving-objects-in-the-formset\"><span class=\"std std-ref\">フォームセット内のオブジェクトを保存する</span></a> で説明しています)。</p>\n</section>\n<section id=\"overriding-clean-on-a-modelformset\">\n<span id=\"model-formsets-overriding-clean\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelFormSet</span></code> の <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> をオーバーライドする<a class=\"heading-anchor\" href=\"#overriding-clean-on-a-modelformset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>モデルフォームの <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForms</span></code> と同様に、デフォルトでは <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelFormSet</span></code> の <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドは、フォームセット内のアイテムがモデルのユニーク制約 (<code class=\"docutils literal notranslate\"><span class=\"pre\">unique</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_for_date|month|year</span></code>) に違反していないことを検証します。 もし <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelFormSet</span></code> の <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> メソッドをオーバーライドし、この検証を維持したい場合は、親クラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">clean</span></code> メソッドを呼び出す必要があります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseModelFormSet</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModelFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseModelFormSet</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">clean</span><span class=\"p\">()</span>\n        <span class=\"c1\"># example custom validation across forms in the formset</span>\n        <span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">forms</span><span class=\"p\">:</span>\n            <span class=\"c1\"># your custom formset validation</span>\n            <span class=\"o\">...</span>\n</code></pre></div>\n<p>また、このステップに到達するまでに、各 <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> に対して個別のモデルインスタンスが既に作成されていることに注意してください。 <code class=\"docutils literal notranslate\"><span class=\"pre\">form.cleaned_data</span></code> の値を変更するだけでは、保存された値に影響を与えることはできません。 <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelFormSet.clean()</span></code> の値を変更したい場合は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">form.instance</span></code> を変更する必要があります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseModelFormSet</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModelFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseModelFormSet</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">clean</span><span class=\"p\">()</span>\n\n        <span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">forms</span><span class=\"p\">:</span>\n            <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()</span>\n            <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">name</span>\n            <span class=\"c1\"># update the instance value.</span>\n            <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">instance</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">name</span>\n</code></pre></div>\n</section>\n<section id=\"using-a-custom-queryset\">\n<h3>カスタムのクエリセットを使う<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>前述のように、モデルのフォームセットで使われるデフォルトのクエリセットはオーバーライドできます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">modelformset_factory</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">manage_authors</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">])</span>\n    <span class=\"n\">queryset</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;O&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        <span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</span><span class=\"p\">(</span>\n            <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span>\n            <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">,</span>\n            <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">queryset</span><span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n            <span class=\"c1\"># Do something.</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">AuthorFormSet</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">queryset</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s2\">&quot;manage_authors.html&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;formset&quot;</span><span class=\"p\">:</span> <span class=\"n\">formset</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>この例では <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> の両方で <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset</span></code> 引数を渡していることに注意してください。</p>\n</section>\n<section id=\"using-the-formset-in-the-template\">\n<h3>テンプレートでフォームセットを使う<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>Django テンプレートでフォームセットをレンダリングするには 3 つの方法があります。</p>\n<p>1つめは、フォームセットにほとんどの作業を任せる方法です:</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>2 つめは、フォームセットを手動でレンダリングして、フォーム自身に処理させる方法です:</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>手動でフォームをレンダリングする場合は、必ず上記のように管理フォームをレンダリングしてください。 <a class=\"reference internal\" href=\"/ja/5.0/topics/forms/formsets/#understanding-the-managementform\"><span class=\"std std-ref\">管理フォームのドキュメント</span></a> を参照してください。</p>\n<p>3 つめは、各フィールドを手動でレンダリングする方法です:</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>この3つめのメソッドを使用し、 <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">for</span> <span class=\"pre\">%}</span></code> ループでフィールドをイテレートしない場合、主キーフィールドをレンダリングする必要があります。たとえば、モデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> フィールドと <code class=\"docutils literal notranslate\"><span class=\"pre\">age</span></code> フィールドをレンダリングする場合、以下のようにします:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">form</span> <span class=\"na\">method</span><span class=\"o\">=</span><span class=\"s\">&quot;post&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">formset.management_form</span> <span class=\"cp\">}}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">form</span> <span class=\"k\">in</span> <span class=\"nv\">formset</span> <span class=\"cp\">%}</span>\n        <span class=\"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>明示的に <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">form.id</span> <span class=\"pre\">}}</span></code> をレンダリングする必要があることに注意してください。これにより、<code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> の場合のモデルのフォームセットが正しく動作するようになります。(この例では <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> という主キーを想定しています。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> という名前ではない独自の主キーを明示的に定義している場合は、それが確実にレンダリングされるようにしてください)。</p>\n</section>\n</section>\n<section id=\"inline-formsets\">\n<span id=\"id4\"></span><h2>インラインフォームセット<a class=\"heading-anchor\" href=\"#inline-formsets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseInlineFormSet\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">BaseInlineFormSet</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseInlineFormSet\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>インラインフォームセットは、モデルフォームセット上の小さな抽象化レイヤーです。これを使うと、外部キーで関連するオブジェクトを操作することが簡単になります。以下の 2 つのモデルがあるとします:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Author</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>特定の著者の本を編集できるフォームセットを作成したい場合、下記のように書くことができます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">inlineformset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">BookFormSet</span> <span class=\"o\">=</span> <span class=\"n\">inlineformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">Book</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Mike Royko&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">BookFormSet</span><span class=\"p\">(</span><span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">author</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">BookFormSet</span></code> の <a class=\"reference internal\" href=\"/ja/5.0/topics/forms/formsets/#formset-prefix\"><span class=\"std std-ref\">prefix</span></a> は <code class=\"docutils literal notranslate\"><span class=\"pre\">'book_set'</span></code> (<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;model</span> <span class=\"pre\">name&gt;_set</span></code>) です。ただし、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code> の <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> への <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> に <a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">related_name</span></code></a> がある場合、その名前が代わりに使用されます。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/forms/models/#django.forms.models.inlineformset_factory\" title=\"django.forms.models.inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">inlineformset_factory()</span></code></a> は、 <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">modelformset_factory()</span></code></a> を使い、<code class=\"docutils literal notranslate\"><span class=\"pre\">can_delete=True</span></code> をセットします。</p>\n</aside>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">参考</p>\n<p><a class=\"reference internal\" href=\"/ja/5.0/topics/forms/formsets/#manually-rendered-can-delete-and-can-order\"><span class=\"std std-ref\">手動でレンダリングされた can_delete と can_order</span></a>.</p>\n</aside>\n<section id=\"overriding-methods-on-an-inlineformset\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">InlineFormSet</span></code> のメソッドをオーバーライドする<a class=\"heading-anchor\" href=\"#overriding-methods-on-an-inlineformset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">InlineFormSet</span></code> のメソッドをオーバーライドするには、 <a class=\"reference internal\" href=\"#django.forms.models.BaseModelFormSet\" title=\"django.forms.models.BaseModelFormSet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseModelFormSet</span></code></a> ではなく、 <a class=\"reference internal\" href=\"#django.forms.models.BaseInlineFormSet\" title=\"django.forms.models.BaseInlineFormSet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseInlineFormSet</span></code></a> をサブクラス化します。</p>\n<p>例えば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> をオーバーライドするとします:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseInlineFormSet</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomInlineFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseInlineFormSet</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">clean</span><span class=\"p\">()</span>\n        <span class=\"c1\"># example custom validation across forms in the formset</span>\n        <span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">forms</span><span class=\"p\">:</span>\n            <span class=\"c1\"># your custom formset validation</span>\n            <span class=\"o\">...</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#model-formsets-overriding-clean\"><span class=\"std std-ref\">ModelFormSet の clean() をオーバーライドする</span></a> も参照してください。</p>\n<p>そして、インラインフォームセットを作成するときに、オプションの引数 <code class=\"docutils literal notranslate\"><span class=\"pre\">formset</span></code> を渡します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">inlineformset_factory</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">BookFormSet</span> <span class=\"o\">=</span> <span class=\"n\">inlineformset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">Book</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">],</span> <span class=\"n\">formset</span><span class=\"o\">=</span><span class=\"n\">CustomInlineFormSet</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Mike Royko&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">BookFormSet</span><span class=\"p\">(</span><span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">author</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"more-than-one-foreign-key-to-the-same-model\">\n<h3>複数の外部キーをひとつのモデルが持っている場合<a class=\"heading-anchor\" href=\"#more-than-one-foreign-key-to-the-same-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>同じモデルが 1 つよりも多くの外部キーを持っている場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">fk_name</span></code> を使い手動で曖昧さを解消しなければなりません。例として、次のモデルについて考えます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Friendship</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">from_friend</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">Friend</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">,</span>\n        <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;from_friends&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">to_friend</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">Friend</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">,</span>\n        <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;friends&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">length_in_months</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>これを解決するには、 <a class=\"reference internal\" href=\"/ja/5.0/ref/forms/models/#django.forms.models.inlineformset_factory\" title=\"django.forms.models.inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">inlineformset_factory()</span></code></a> に <code class=\"docutils literal notranslate\"><span class=\"pre\">fk_name</span></code> を使用します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">FriendshipFormSet</span> <span class=\"o\">=</span> <span class=\"n\">inlineformset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Friend</span><span class=\"p\">,</span> <span class=\"n\">Friendship</span><span class=\"p\">,</span> <span class=\"n\">fk_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;from_friend&quot;</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;to_friend&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;length_in_months&quot;</span><span class=\"p\">]</span>\n<span class=\"gp\">... </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=\"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\">def</span><span class=\"w\"> </span><span class=\"nf\">manage_books</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">author_id</span><span class=\"p\">):</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">author_id</span><span class=\"p\">)</span>\n    <span class=\"n\">BookInlineFormSet</span> <span class=\"o\">=</span> <span class=\"n\">inlineformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">Book</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">])</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        <span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">BookInlineFormSet</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">,</span> <span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">author</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"n\">formset</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n            <span class=\"c1\"># Do something. Should generally end with a redirect. For example:</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span><span class=\"n\">author</span><span class=\"o\">.</span><span class=\"n\">get_absolute_url</span><span class=\"p\">())</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">formset</span> <span class=\"o\">=</span> <span class=\"n\">BookInlineFormSet</span><span class=\"p\">(</span><span class=\"n\">instance</span><span class=\"o\">=</span><span class=\"n\">author</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s2\">&quot;manage_books.html&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;formset&quot;</span><span class=\"p\">:</span> <span class=\"n\">formset</span><span class=\"p\">})</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> いずれにおいても <code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code> を渡していることに注目してください</p>\n</section>\n<section id=\"specifying-widgets-to-use-in-the-inline-form\">\n<h3>インラインフォームにウィジェットを指定する<a class=\"heading-anchor\" href=\"#specifying-widgets-to-use-in-the-inline-form\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">inlineformset_factory</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code> を使っており、多くの引数は <code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code> に渡されます。これは <code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code> と同様に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> 引数を渡すことができることを意味しています。詳細は、上記 <a class=\"reference internal\" href=\"#specifying-widgets-to-use-in-the-form-with-widgets\">Specifying widgets to use in the form with widgets</a> を参照してください。</p>\n</section>\n</section>","rootId":"creating-forms-from-models","toc":[{"title":"ModelForm","anchor":"modelform","children":[{"title":"フィールドの型","anchor":"field-types","children":[]},{"title":"完全な具体例","anchor":"a-full-example","children":[]},{"title":"ModelForm の検証 (バリデーション)","anchor":"validation-on-a-modelform","children":[{"title":"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":"初期値を指定する","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":"widgets を使って、フォームで使用するウィジェットを指定する","anchor":"specifying-widgets-to-use-in-the-form-with-widgets","children":[]},{"title":"localized_fields でフィールドのローカライズを有効にする","anchor":"enabling-localization-for-fields-with-localized-fields","children":[]},{"title":"初期値を指定する","anchor":"id2","children":[]},{"title":"フォームセット内のオブジェクトを保存する","anchor":"saving-objects-in-the-formset","children":[]},{"title":"編集可能なオブジェクトの数を制限する","anchor":"limiting-the-number-of-editable-objects","children":[]},{"title":"新しいオブジェクトの作成を防ぐ","anchor":"preventing-new-objects-creation","children":[]},{"title":"ビューでモデルフォームセットを使う","anchor":"using-a-model-formset-in-a-view","children":[]},{"title":"ModelFormSet の clean() をオーバーライドする","anchor":"overriding-clean-on-a-modelformset","children":[]},{"title":"カスタムのクエリセットを使う","anchor":"using-a-custom-queryset","children":[]},{"title":"テンプレートでフォームセットを使う","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/5.0/topics/"},{"docname":"topics/forms/index","title":"フォームを使う","url":"/ja/5.0/topics/forms/"}],"prev":{"docname":"topics/forms/formsets","title":"フォームセット (Formset)","url":"/ja/5.0/topics/forms/formsets/"},"next":{"docname":"topics/forms/media","title":"フォームアセット (Media クラス)","url":"/ja/5.0/topics/forms/media/"},"formats":{"html":"/ja/5.0/topics/forms/modelforms/","markdown":"/ja/5.0/topics/forms/modelforms.md","json":"/ja/5.0/topics/forms/modelforms.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/topics/forms/modelforms.txt","official":"https://docs.djangoproject.com/ja/5.0/topics/forms/modelforms/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}