{"title":"Creating forms from models","version":"6.0","locale":"es","docname":"topics/forms/modelforms","url":"/es/6.0/topics/forms/modelforms/","canonical":"https://djangodocs.dev/es/6.0/topics/forms/modelforms/","summary":"ModelForm Link to this heading # class ModelForm Link to this definition # If you’re building a database-driven app, chances are you’ll have forms that map closely…","html":"<h1>Creating forms from models<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>If you’re building a database-driven app, chances are you’ll have forms that\nmap closely to Django models. For instance, you might have a <code class=\"docutils literal notranslate\"><span class=\"pre\">BlogComment</span></code>\nmodel, and you want to create a form that lets people submit comments. In this\ncase, it would be redundant to define the field types in your form, because\nyou’ve already defined the fields in your model.</p>\n<p>For this reason, Django provides a helper class that lets you create a <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code>\nclass from a Django model.</p>\n<p>Por ejemplo:</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<span id=\"model-form-field-types\"></span><h3>Field types<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>The generated <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> class will have a form field for every model field\nspecified, in the order specified in the <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> attribute.</p>\n<p>Each model field has a corresponding default form field. For example, a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code> on a model is represented as a <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code> on a form. A model\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> is represented as a <code class=\"docutils literal notranslate\"><span class=\"pre\">MultipleChoiceField</span></code>. Here is the\nfull list of conversions:</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>Model field</p></th>\n<th class=\"head\"><p>Form field</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/es/6.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>Not represented in the form</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/es/6.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>Not represented in the form</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/es/6.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=\"/es/6.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> with\n<code class=\"docutils literal notranslate\"><span class=\"pre\">min_value</span></code> set to -9223372036854775808\nand <code class=\"docutils literal notranslate\"><span class=\"pre\">max_value</span></code> set to 9223372036854775807.</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/es/6.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=\"/es/6.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>, if\n<a class=\"reference internal\" href=\"/es/6.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> is set to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> on the model field, otherwise not\nrepresented in the form.</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/es/6.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=\"/es/6.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>, or\n<a class=\"reference internal\" href=\"/es/6.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> if\n<code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code>.</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/es/6.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=\"/es/6.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> with\n<code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> set to the model field’s\n<code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> and\n<a class=\"reference internal\" href=\"/es/6.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>\nset to <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> if <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code>.</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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>\n(see below)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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>Not represented in the form</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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> with\n<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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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=\"/es/6.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>As you might expect, the <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> model field\ntypes are special cases:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> is represented by <code class=\"docutils literal notranslate\"><span class=\"pre\">django.forms.ModelChoiceField</span></code>,\nwhich is a <code class=\"docutils literal notranslate\"><span class=\"pre\">ChoiceField</span></code> whose choices are a model <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> is represented by\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.forms.ModelMultipleChoiceField</span></code>, which is a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">MultipleChoiceField</span></code> whose choices are a model <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>.</p></li>\n</ul>\n<p>In addition, each generated form field has attributes set as follows:</p>\n<ul class=\"simple\">\n<li><p>If the model field has <code class=\"docutils literal notranslate\"><span class=\"pre\">blank=True</span></code>, then <code class=\"docutils literal notranslate\"><span class=\"pre\">required</span></code> is set to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> on the form field. Otherwise, <code class=\"docutils literal notranslate\"><span class=\"pre\">required=True</span></code>.</p></li>\n<li><p>The form field’s <code class=\"docutils literal notranslate\"><span class=\"pre\">label</span></code> is set to the <code class=\"docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code> of the model\nfield, with the first character capitalized.</p></li>\n<li><p>The form field’s <code class=\"docutils literal notranslate\"><span class=\"pre\">help_text</span></code> is set to the <code class=\"docutils literal notranslate\"><span class=\"pre\">help_text</span></code> of the model\nfield.</p></li>\n<li><p>If the model field has <code class=\"docutils literal notranslate\"><span class=\"pre\">choices</span></code> set, then the form field’s <code class=\"docutils literal notranslate\"><span class=\"pre\">widget</span></code>\nwill be set to <code class=\"docutils literal notranslate\"><span class=\"pre\">Select</span></code>, with choices coming from the model field’s\n<code class=\"docutils literal notranslate\"><span class=\"pre\">choices</span></code>. The choices will normally include the blank choice which is\nselected by default. If the field is required, this forces the user to\nmake a selection. The blank choice will not be included if the model\nfield has <code class=\"docutils literal notranslate\"><span class=\"pre\">blank=False</span></code> and an explicit <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> value (the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> value will be initially selected instead).</p></li>\n</ul>\n<p>Finally, note that you can override the form field used for a given model\nfield. See <a class=\"reference internal\" href=\"#overriding-the-default-fields\">Overriding the default fields</a> below.</p>\n</section>\n<section id=\"a-full-example\">\n<h3>Un ejemplo completo<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>Consider this set of models:</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>With these models, the <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> subclasses above would be roughly\nequivalent to this (the only difference being the <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> method, which\nwe’ll discuss in a moment.):</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>Validation on a <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>There are two main steps involved in validating a <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code>:</p>\n<ol class=\"arabic simple\">\n<li><p><a class=\"reference internal\" href=\"/es/6.0/ref/forms/validation/\"><span class=\"doc\">Validating the form</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/6.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">Validating the model instance</span></a></p></li>\n</ol>\n<p>Just like normal form validation, model form validation is triggered implicitly\nwhen calling <a class=\"reference internal\" href=\"/es/6.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> or accessing the\n<a class=\"reference internal\" href=\"/es/6.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> attribute and explicitly when calling\n<code class=\"docutils literal notranslate\"><span class=\"pre\">full_clean()</span></code>, although you will typically not use the latter method in\npractice.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Model</span></code> validation is triggered from within the form validation step right\nafter the form’s <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> method is called. First, the model’s\n<a class=\"reference internal\" href=\"/es/6.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\">full_clean()</span></code></a> is called with\n<code class=\"docutils literal notranslate\"><span class=\"pre\">validate_unique=False</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">validate_constraints=False</span></code>, then the model’s\n<a class=\"reference internal\" href=\"/es/6.0/ref/models/instances/#django.db.models.Model.validate_unique\" title=\"django.db.models.Model.validate_unique\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">validate_unique()</span></code></a> and\n<a class=\"reference internal\" href=\"/es/6.0/ref/models/instances/#django.db.models.Model.validate_constraints\" title=\"django.db.models.Model.validate_constraints\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">validate_constraints()</span></code></a> methods are called in\norder.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Advertencia</p>\n<p>The cleaning process modifies the model instance passed to the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> constructor in various ways. For instance, any date fields on\nthe model are converted into actual date objects. Failed validation may\nleave the underlying model instance in an inconsistent state and therefore\nit’s not recommended to reuse it.</p>\n</aside>\n<section id=\"overriding-the-clean-method\">\n<span id=\"overriding-modelform-clean-method\"></span><h4>Overriding the <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> method<a class=\"heading-anchor\" href=\"#overriding-the-clean-method\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>You can override the <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> method on a model form to provide additional\nvalidation in the same way you can on a normal form.</p>\n<p>A model form instance attached to a model object will contain an <code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code>\nattribute that gives its methods access to that specific model instance.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Advertencia</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm.clean()</span></code> method sets flags that make the <a class=\"reference internal\" href=\"/es/6.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">model\nvalidation</span></a> step validate the uniqueness of model\nfields that are marked as <code class=\"docutils literal notranslate\"><span class=\"pre\">unique</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> or\n<code class=\"docutils literal notranslate\"><span class=\"pre\">unique_for_date|month|year</span></code>, as well as constraints.</p>\n<p>If you would like to override the <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> method and maintain this\nvalidation, you must call the parent class’s <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> method.</p>\n</aside>\n</section>\n<section id=\"interaction-with-model-validation\">\n<h4>Interaction with model validation<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>As part of the validation process, <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> will call the <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code>\nmethod of each field on your model that has a corresponding field on your form.\nIf you have excluded any model fields, validation will not be run on those\nfields. See the <a class=\"reference internal\" href=\"/es/6.0/ref/forms/validation/\"><span class=\"doc\">form validation</span></a> documentation\nfor more on how field cleaning and validation work.</p>\n<p>The model’s <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> method will be called before any uniqueness or\nconstraint checks are made. See <a class=\"reference internal\" href=\"/es/6.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">Validating objects</span></a>\nfor more information on the model’s <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> hook.</p>\n</section>\n<section id=\"considerations-regarding-model-s-error-messages\">\n<span id=\"considerations-regarding-model-errormessages\"></span><h4>Considerations regarding model’s <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>Error messages defined at the\n<a class=\"reference internal\" href=\"/es/6.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\">form</span> <span class=\"pre\">field</span></code></a> level or at the\n<a class=\"reference internal\" href=\"#modelforms-overriding-default-fields\"><span class=\"std std-ref\">form Meta</span></a> level always take\nprecedence over the error messages defined at the\n<a class=\"reference internal\" href=\"/es/6.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\">model</span> <span class=\"pre\">field</span></code></a> level.</p>\n<p>Error messages  defined on <a class=\"reference internal\" href=\"/es/6.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\">model</span> <span class=\"pre\">fields</span></code></a> are only used when the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> is raised during the <a class=\"reference internal\" href=\"/es/6.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">model validation</span></a> step and no corresponding error messages are defined at\nthe form level.</p>\n<p>You can override the error messages from <code class=\"docutils literal notranslate\"><span class=\"pre\">NON_FIELD_ERRORS</span></code> raised by model\nvalidation by adding the <a class=\"reference internal\" href=\"/es/6.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> key\nto the <code class=\"docutils literal notranslate\"><span class=\"pre\">error_messages</span></code> dictionary of the <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code>’s inner <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code>\nclass:</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>The <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> method<a class=\"heading-anchor\" href=\"#the-save-method\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Every <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> also has a <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> method. This method creates and saves\na database object from the data bound to the form. A subclass of <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code>\ncan accept an existing model instance as the keyword argument <code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code>; if\nthis is supplied, <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> will update that instance. If it’s not supplied,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> will create a new instance of the specified model:</p>\n<div class=\"code-block\" data-language=\"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>Note that if the form <a class=\"reference internal\" href=\"#validation-on-modelform\"><span class=\"std std-ref\">hasn’t been validated</span></a>, calling <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> will do so by checking\n<code class=\"docutils literal notranslate\"><span class=\"pre\">form.errors</span></code>. A <code class=\"docutils literal notranslate\"><span class=\"pre\">ValueError</span></code> will be raised if the data in the form\ndoesn’t validate – i.e., if <code class=\"docutils literal notranslate\"><span class=\"pre\">form.errors</span></code> evaluates to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n<p>If an optional field doesn’t appear in the form’s data, the resulting model\ninstance uses the model field <a class=\"reference internal\" href=\"/es/6.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>, if\nthere is one, for that field. This behavior doesn’t apply to fields that use\n<a class=\"reference internal\" href=\"/es/6.0/ref/forms/widgets/#django.forms.CheckboxInput\" title=\"django.forms.CheckboxInput\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CheckboxInput</span></code></a>,\n<a class=\"reference internal\" href=\"/es/6.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>, or\n<a class=\"reference internal\" href=\"/es/6.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> (or any custom widget whose\n<a class=\"reference internal\" href=\"/es/6.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> method always returns\n<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>) since an unchecked checkbox and unselected <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;select</span> <span class=\"pre\">multiple&gt;</span></code>\ndon’t appear in the data of an HTML form submission. Use a custom form field or\nwidget if you’re designing an API and want the default fallback behavior for a\nfield that uses one of these widgets.</p>\n<p>This <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> method accepts an optional <code class=\"docutils literal notranslate\"><span class=\"pre\">commit</span></code> keyword argument, which\naccepts either <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. If you call <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> with\n<code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code>, then it will return an object that hasn’t yet been saved to\nthe database. In this case, it’s up to you to call <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> on the resulting\nmodel instance. This is useful if you want to do custom processing on the\nobject before saving it, or if you want to use one of the specialized\n<a class=\"reference internal\" href=\"/es/6.0/ref/models/instances/#ref-models-force-insert\"><span class=\"std std-ref\">model saving options</span></a>. <code class=\"docutils literal notranslate\"><span class=\"pre\">commit</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>\nby default.</p>\n<p>Another side effect of using <code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code> is seen when your model has\na many-to-many relation with another model. If your model has a many-to-many\nrelation and you specify <code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code> when you save a form, Django cannot\nimmediately save the form data for the many-to-many relation. This is because\nit isn’t possible to save many-to-many data for an instance until the instance\nexists in the database.</p>\n<p>To work around this problem, every time you save a form using <code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code>,\nDjango adds a <code class=\"docutils literal notranslate\"><span class=\"pre\">save_m2m()</span></code> method to your <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> subclass. After\nyou’ve manually saved the instance produced by the form, you can invoke\n<code class=\"docutils literal notranslate\"><span class=\"pre\">save_m2m()</span></code> to save the many-to-many form data. For example:</p>\n<div class=\"code-block\" data-language=\"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>Calling <code class=\"docutils literal notranslate\"><span class=\"pre\">save_m2m()</span></code> is only required if you use <code class=\"docutils literal notranslate\"><span class=\"pre\">save(commit=False)</span></code>.\nWhen you use a <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> on a form, all data – including many-to-many data –\nis saved without the need for any additional method calls. For example:</p>\n<div class=\"code-block\" data-language=\"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>Other than the <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">save_m2m()</span></code> methods, a <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> works\nexactly the same way as any other <code class=\"docutils literal notranslate\"><span class=\"pre\">forms</span></code> form. For example, the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">is_valid()</span></code> method is used to check for validity, the <code class=\"docutils literal notranslate\"><span class=\"pre\">is_multipart()</span></code>\nmethod is used to determine whether a form requires multipart file upload (and\nhence whether <code class=\"docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code> must be passed to the form), etc. See\n<a class=\"reference internal\" href=\"/es/6.0/ref/forms/api/#binding-uploaded-files\"><span class=\"std std-ref\">Binding uploaded files to a form</span></a> for more information.</p>\n</section>\n<section id=\"selecting-the-fields-to-use\">\n<span id=\"modelforms-selecting-fields\"></span><h3>Selecting the fields to use<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>It is strongly recommended that you explicitly set all fields that should be\nedited in the form using the <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> attribute. Failure to do so can easily\nlead to security problems when a form unexpectedly allows a user to set certain\nfields, especially when new fields are added to a model. Depending on how the\nform is rendered, the problem may not even be visible on the web page.</p>\n<p>The alternative approach would be to include all fields automatically, or\nremove only some. This fundamental approach is known to be much less secure and\nhas led to serious exploits on major websites (e.g. <a class=\"reference external\" href=\"https://github.blog/2012-03-04-public-key-security-vulnerability-and-mitigation/\">GitHub</a>\n).</p>\n<p>There are, however, two shortcuts available for cases where you can guarantee\nthese security concerns do not apply to you:</p>\n<ol class=\"arabic\">\n<li><p>Set the <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> attribute to the special value <code class=\"docutils literal notranslate\"><span class=\"pre\">'__all__'</span></code> to indicate\nthat all fields in the model should be used. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"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>Set the <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude</span></code> attribute of the <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code>’s inner <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> class to\na list of fields to be excluded from the form.</p>\n<p>Por ejemplo:</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>Since the <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> model has the 3 fields <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">birth_date</span></code>, this will result in the fields <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">birth_date</span></code>\nbeing present on the form.</p>\n</li>\n</ol>\n<p>If either of these are used, the order the fields appear in the form will be\nthe order the fields are defined in the model, with <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code>\ninstances appearing last.</p>\n<p>In addition, Django applies the following rule: if you set <code class=\"docutils literal notranslate\"><span class=\"pre\">editable=False</span></code>\non the model field, <em>any</em> form created from the model via <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> will\nnot include that field.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Any fields not included in a form by the above logic\nwill not be set by the form’s <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> method. Also, if you\nmanually add the excluded fields back to the form, they will not\nbe initialized from the model instance.</p>\n<p>Django will prevent any attempt to save an incomplete model, so if\nthe model does not allow the missing fields to be empty, and does\nnot provide a default value for the missing fields, any attempt to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> a <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> with missing fields will fail. To\navoid this failure, you must instantiate your model with initial\nvalues for the missing, but required fields:</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>Alternatively, you can use <code class=\"docutils literal notranslate\"><span class=\"pre\">save(commit=False)</span></code> and manually set\nany extra required fields:</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>See the <a class=\"reference internal\" href=\"#the-save-method\">section on saving forms</a> for more details on using\n<code class=\"docutils literal notranslate\"><span class=\"pre\">save(commit=False)</span></code>.</p>\n</aside>\n</section>\n<section id=\"overriding-the-default-fields\">\n<span id=\"modelforms-overriding-default-fields\"></span><h3>Overriding the default fields<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>The default field types, as described in the <a class=\"reference internal\" href=\"#field-types\">Field types</a> table above, are\nsensible defaults. If you have a <code class=\"docutils literal notranslate\"><span class=\"pre\">DateField</span></code> in your model, chances are you’d\nwant that to be represented as a <code class=\"docutils literal notranslate\"><span class=\"pre\">DateField</span></code> in your form. But <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code>\ngives you the flexibility of changing the form field for a given model.</p>\n<p>To specify a custom widget for a field, use the <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> attribute of the\ninner <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> class. This should be a dictionary mapping field names to widget\nclasses or instances.</p>\n<p>For example, if you want the <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code> for the <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> attribute of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> to be represented by a <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;textarea&gt;</span></code> instead of its default\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;input</span> <span class=\"pre\">type=&quot;text&quot;&gt;</span></code>, you can override the field’s widget:</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>The <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> dictionary accepts either widget instances (e.g.,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Textarea(...)</span></code>) or classes (e.g., <code class=\"docutils literal notranslate\"><span class=\"pre\">Textarea</span></code>). Note that the <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code>\ndictionary is ignored for a model field with a non-empty <code class=\"docutils literal notranslate\"><span class=\"pre\">choices</span></code> attribute.\nIn this case, you must override the form field to use a different widget.</p>\n<p>Similarly, you can specify the <code class=\"docutils literal notranslate\"><span class=\"pre\">labels</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">help_texts</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">error_messages</span></code> attributes of the inner <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> class if you want to\nfurther customize a field.</p>\n<p>For example if you wanted to customize the wording of all user facing strings\nfor the <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> field:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"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>You can also specify <code class=\"docutils literal notranslate\"><span class=\"pre\">field_classes</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">formfield_callback</span></code> to customize\nthe type of fields instantiated by the form.</p>\n<p>For example, if you wanted to use <code class=\"docutils literal notranslate\"><span class=\"pre\">MySlugFormField</span></code> for the <code class=\"docutils literal notranslate\"><span class=\"pre\">slug</span></code>\nfield, you could do the following:</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>o:</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>Finally, if you want complete control over of a field – including its type,\nvalidators, required, etc. – you can do this by declaratively specifying\nfields like you would in a regular <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code>.</p>\n<p>If you want to specify a field’s validators, you can do so by defining\nthe field declaratively and setting its <code class=\"docutils literal notranslate\"><span class=\"pre\">validators</span></code> parameter:</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\">Nota</p>\n<p>When you explicitly instantiate a form field like this, it is important to\nunderstand how <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> and regular <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> are related.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> is a regular <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> which can automatically generate\ncertain fields. The fields that are automatically generated depend on\nthe content of the <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> class and on which fields have already been\ndefined declaratively. Basically, <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> will <strong>only</strong> generate\nfields that are <strong>missing</strong> from the form, or in other words, fields that\nweren’t defined declaratively.</p>\n<p>Fields defined declaratively are left as-is, therefore any customizations\nmade to <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> attributes such as <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">labels</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">help_texts</span></code>, or <code class=\"docutils literal notranslate\"><span class=\"pre\">error_messages</span></code> are ignored; these only apply to\nfields that are generated automatically.</p>\n<p>Similarly, fields defined declaratively do not draw their attributes like\n<code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">required</span></code> from the corresponding model. If you want to\nmaintain the behavior specified in the model, you must set the relevant\narguments explicitly when declaring the form field.</p>\n<p>For example, if the <code class=\"docutils literal notranslate\"><span class=\"pre\">Article</span></code> model looks like this:</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>and you want to do some custom validation for <code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code>, while keeping\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">blank</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">help_text</span></code> values as specified, you might define\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleForm</span></code> like this:</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>You must ensure that the type of the form field can be used to set the\ncontents of the corresponding model field. When they are not compatible,\nyou will get a <code class=\"docutils literal notranslate\"><span class=\"pre\">ValueError</span></code> as no implicit conversion takes place.</p>\n<p>See the <a class=\"reference internal\" href=\"/es/6.0/ref/forms/fields/\"><span class=\"doc\">form field documentation</span></a> for more\ninformation on fields and their arguments.</p>\n</aside>\n</section>\n<section id=\"enabling-localization-of-fields\">\n<span id=\"modelforms-enabling-localization-of-fields\"></span><h3>Enabling localization of fields<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>By default, the fields in a <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> will not localize their data. To\nenable localization for fields, you can use the <code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code>\nattribute on the <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> class.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"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>If <code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code> is set to the special value <code class=\"docutils literal notranslate\"><span class=\"pre\">'__all__'</span></code>, all fields\nwill be localized.</p>\n</section>\n<section id=\"form-inheritance\">\n<h3>Form inheritance<a class=\"heading-anchor\" href=\"#form-inheritance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As with basic forms, you can extend and reuse <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> classes by\ninheriting them. This is useful if you need to declare extra fields or extra\nmethods on a parent class for use in a number of forms derived from models.\nFor example, using the previous <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleForm</span></code> class:</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>This creates a form that behaves identically to <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleForm</span></code>, except there’s\nsome extra validation and cleaning for the <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> field.</p>\n<p>You can also subclass the parent’s <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> inner class if you want to change\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.fields</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.exclude</span></code> lists:</p>\n<div class=\"code-block\" data-language=\"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>This adds the extra method from the <code class=\"docutils literal notranslate\"><span class=\"pre\">EnhancedArticleForm</span></code> and modifies\nthe original <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleForm.Meta</span></code> to remove one field.</p>\n<p>There are a couple of things to note, however.</p>\n<ul>\n<li><p>Normal Python name resolution rules apply. If you have multiple base\nclasses that declare a <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> inner class, only the first one will be\nused. This means the child’s <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code>, if it exists, otherwise the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> of the first parent, etc.</p></li>\n<li><p>It’s possible to inherit from both <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> simultaneously,\nhowever, you must ensure that <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> appears first in the MRO. This is\nbecause these classes rely on different metaclasses and a class can only have\none metaclass.</p></li>\n<li><p>It’s possible to declaratively remove a <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> inherited from a parent\nclass by setting the name to be <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> on the subclass.</p>\n<p>You can only use this technique to opt out from a field defined declaratively\nby a parent class; it won’t prevent the <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> metaclass from\ngenerating a default field. To opt-out from default fields, see\n<a class=\"reference internal\" href=\"#modelforms-selecting-fields\"><span class=\"std std-ref\">Selecting the fields to use</span></a>.</p>\n</li>\n</ul>\n</section>\n<section id=\"providing-initial-values\">\n<h3>Providing initial values<a class=\"heading-anchor\" href=\"#providing-initial-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As with regular forms, it’s possible to specify initial data for forms by\nspecifying an <code class=\"docutils literal notranslate\"><span class=\"pre\">initial</span></code> parameter when instantiating the form. Initial\nvalues provided this way will override both initial values from the form field\nand values from an attached model instance. For example:</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 function<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>You can create forms from a given model using the standalone function\n<a class=\"reference internal\" href=\"/es/6.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>, instead of using a class\ndefinition. This may be more convenient if you do not have many customizations\nto make:</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>This can also be used to make modifications to existing forms, for example by\nspecifying the widgets to be used for a given field:</p>\n<div class=\"code-block\" data-language=\"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>The fields to include can be specified using the <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude</span></code>\nkeyword arguments, or the corresponding attributes on the <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> inner\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> class. Please see the <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> <a class=\"reference internal\" href=\"#modelforms-selecting-fields\"><span class=\"std std-ref\">Selecting the fields to use</span></a>\ndocumentation.</p>\n<p>… or enable localization for specific fields:</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>Model formsets<a class=\"heading-anchor\" href=\"#model-formsets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">BaseModelFormSet</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Like <a class=\"reference internal\" href=\"/es/6.0/topics/forms/formsets/\"><span class=\"doc\">regular formsets</span></a>, Django provides a couple\nof enhanced formset classes to make working with Django models more\nconvenient. Let’s reuse the <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> model from above:</p>\n<div class=\"code-block\" data-language=\"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>Using <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> restricts the formset to use only the given fields.\nAlternatively, you can take an «opt-out» approach, specifying which fields to\nexclude:</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>This will create a formset that is capable of working with the data associated\nwith the <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> model. It works just like a regular formset:</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\">Nota</p>\n<p><a class=\"reference internal\" href=\"/es/6.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> uses\n<a class=\"reference internal\" href=\"/es/6.0/ref/forms/formsets/#django.forms.formsets.formset_factory\" title=\"django.forms.formsets.formset_factory\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">formset_factory()</span></code></a> to generate formsets. This\nmeans that a model formset is an extension of a basic formset that knows\nhow to interact with a particular model.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>When using <a class=\"reference internal\" href=\"/es/6.0/topics/db/models/#multi-table-inheritance\"><span class=\"std std-ref\">multi-table inheritance</span></a>, forms\ngenerated by a formset factory will contain a parent link field (by default\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;parent_model_name&gt;_ptr</span></code>) instead of an <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> field.</p>\n</aside>\n<section id=\"changing-the-queryset\">\n<h3>Changing the queryset<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>By default, when you create a formset from a model, the formset will use a\nqueryset that includes all objects in the model (e.g.,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Author.objects.all()</span></code>). You can override this behavior by using the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">queryset</span></code> argument:</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>Alternatively, you can create a subclass that sets <code class=\"docutils literal notranslate\"><span class=\"pre\">self.queryset</span></code> in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</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>Then, pass your <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseAuthorFormSet</span></code> class to the factory function:</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>If you want to return a formset that doesn’t include <em>any</em> preexisting\ninstances of the model, you can specify an empty QuerySet:</p>\n<div class=\"code-block\" data-language=\"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>Changing the form<a class=\"heading-anchor\" href=\"#changing-the-form\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>By default, when you use <code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code>, a model form will\nbe created using <a class=\"reference internal\" href=\"/es/6.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>.\nOften, it can be useful to specify a custom model form. For example,\nyou can create a custom model form that has custom validation:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ModelForm</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Author</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"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>Then, pass your model form to the factory function:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"o\">=</span><span class=\"n\">AuthorForm</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>It is not always necessary to define a custom model form. The\n<code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code> function has several arguments which are\npassed through to <code class=\"docutils literal notranslate\"><span class=\"pre\">modelform_factory</span></code>, which are described below.</p>\n</section>\n<section id=\"specifying-widgets-to-use-in-the-form-with-widgets\">\n<h3>Specifying widgets to use in the form with <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code><a class=\"heading-anchor\" href=\"#specifying-widgets-to-use-in-the-form-with-widgets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Using the <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> parameter, you can specify a dictionary of values to\ncustomize the <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code>’s widget class for a particular field. This\nworks the same way as the <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> dictionary on the inner <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code>\nclass of a <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> works:</p>\n<div class=\"code-block\" data-language=\"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>Enabling localization for fields with <code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code><a class=\"heading-anchor\" href=\"#enabling-localization-for-fields-with-localized-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Using the <code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code> parameter, you can enable localization for\nfields in the form.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">AuthorFormSet</span> <span class=\"o\">=</span> <span class=\"n\">modelformset_factory</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">],</span>\n<span class=\"gp\">... </span>    <span class=\"n\">localized_fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">localized_fields</span></code> is set to the special value <code class=\"docutils literal notranslate\"><span class=\"pre\">'__all__'</span></code>, all fields\nwill be localized.</p>\n</section>\n<section id=\"id2\">\n<h3>Providing initial values<a class=\"heading-anchor\" href=\"#id2\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As with regular formsets, it’s possible to <a class=\"reference internal\" href=\"/es/6.0/topics/forms/formsets/#formsets-initial-data\"><span class=\"std std-ref\">specify initial data</span></a> for forms in the formset by specifying an <code class=\"docutils literal notranslate\"><span class=\"pre\">initial</span></code>\nparameter when instantiating the model formset class returned by\n<a class=\"reference internal\" href=\"/es/6.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>. However, with model\nformsets, the initial values only apply to extra forms, those that aren’t\nattached to an existing model instance. If the length of <code class=\"docutils literal notranslate\"><span class=\"pre\">initial</span></code> exceeds\nthe number of extra forms, the excess initial data is ignored. If the extra\nforms with initial data aren’t changed by the user, they won’t be validated or\nsaved.</p>\n</section>\n<section id=\"saving-objects-in-the-formset\">\n<span id=\"id3\"></span><h3>Saving objects in the formset<a class=\"heading-anchor\" href=\"#saving-objects-in-the-formset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As with a <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code>, you can save the data as a model object. This is done\nwith the formset’s <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> method:</p>\n<div class=\"code-block\" data-language=\"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>The <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> method returns the instances that have been saved to the\ndatabase. If a given instance’s data didn’t change in the bound data, the\ninstance won’t be saved to the database and won’t be included in the return\nvalue (<code class=\"docutils literal notranslate\"><span class=\"pre\">instances</span></code>, in the above example).</p>\n<p>When fields are missing from the form (for example because they have been\nexcluded), these fields will not be set by the <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> method. You can find\nmore information about this restriction, which also holds for regular\nmodel forms, in <a class=\"reference internal\" href=\"#selecting-the-fields-to-use\">Selecting the fields to use</a>.</p>\n<p>Pass <code class=\"docutils literal notranslate\"><span class=\"pre\">commit=False</span></code> to return the unsaved model instances:</p>\n<div class=\"code-block\" data-language=\"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>This gives you the ability to attach data to the instances before saving them\nto the database. If your formset contains a <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code>, you’ll also\nneed to call <code class=\"docutils literal notranslate\"><span class=\"pre\">formset.save_m2m()</span></code> to ensure the many-to-many relationships\nare saved properly.</p>\n<p>After calling <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code>, your model formset will have three new attributes\ncontaining the formset’s changes:</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet.changed_objects\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">models.BaseModelFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">changed_objects</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet.changed_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet.deleted_objects\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">models.BaseModelFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">deleted_objects</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet.deleted_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet.new_objects\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">models.BaseModelFormSet.</span></span><span class=\"sig-name descname\"><span class=\"pre\">new_objects</span></span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet.new_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</section>\n<section id=\"limiting-the-number-of-editable-objects\">\n<span id=\"model-formsets-max-num\"></span><h3>Limiting the number of editable objects<a class=\"heading-anchor\" href=\"#limiting-the-number-of-editable-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As with regular formsets, you can use the <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> parameters\nto <a class=\"reference internal\" href=\"/es/6.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> to limit the number of\nextra forms displayed.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> does not prevent existing objects from being displayed:</p>\n<div class=\"code-block\" data-language=\"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>Also, <code class=\"docutils literal notranslate\"><span class=\"pre\">extra=0</span></code> doesn’t prevent creation of new model instances as you can\n<a class=\"reference internal\" href=\"/es/6.0/topics/forms/formsets/#understanding-the-managementform\"><span class=\"std std-ref\">add additional forms with JavaScript</span></a>\nor send additional POST data. See <a class=\"reference internal\" href=\"#model-formsets-edit-only\"><span class=\"std std-ref\">Preventing new objects creation</span></a> on how to do\nthis.</p>\n<p>If the value of <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> is greater than the number of existing related\nobjects, up to <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> additional blank forms will be added to the formset,\nso long as the total number of forms does not exceed <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code>:</p>\n<div class=\"code-block\" data-language=\"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>A <code class=\"docutils literal notranslate\"><span class=\"pre\">max_num</span></code> value of <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> (the default) puts a high limit on the number\nof forms displayed (1000). In practice this is equivalent to no limit.</p>\n</section>\n<section id=\"preventing-new-objects-creation\">\n<span id=\"model-formsets-edit-only\"></span><h3>Preventing new objects creation<a class=\"heading-anchor\" href=\"#preventing-new-objects-creation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Using the <code class=\"docutils literal notranslate\"><span class=\"pre\">edit_only</span></code> parameter, you can prevent creation of any new\nobjects:</p>\n<div class=\"code-block\" data-language=\"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>Here, the formset will only edit existing <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> instances. No other\nobjects will be created or edited.</p>\n</section>\n<section id=\"using-a-model-formset-in-a-view\">\n<h3>Using a model formset in a view<a class=\"heading-anchor\" href=\"#using-a-model-formset-in-a-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Model formsets are very similar to formsets. Let’s say we want to present a\nformset to edit <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> model instances:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">modelformset_factory</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n\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>As you can see, the view logic of a model formset isn’t drastically different\nthan that of a «normal» formset. The only difference is that we call\n<code class=\"docutils literal notranslate\"><span class=\"pre\">formset.save()</span></code> to save the data into the database. (This was described\nabove, in <a class=\"reference internal\" href=\"#saving-objects-in-the-formset\"><span class=\"std std-ref\">Saving objects in the formset</span></a>.)</p>\n</section>\n<section id=\"overriding-clean-on-a-modelformset\">\n<span id=\"model-formsets-overriding-clean\"></span><h3>Overriding <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> on a <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelFormSet</span></code><a class=\"heading-anchor\" href=\"#overriding-clean-on-a-modelformset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Just like with a <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code>, by default the <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> method of a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelFormSet</span></code> will validate that none of the items in the formset violate\nthe unique constraints on your model (either <code class=\"docutils literal notranslate\"><span class=\"pre\">unique</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> or\n<code class=\"docutils literal notranslate\"><span class=\"pre\">unique_for_date|month|year</span></code>). If you want to override the <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> method\non a <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelFormSet</span></code> and maintain this validation, you must call the parent\nclass’s <code class=\"docutils literal notranslate\"><span class=\"pre\">clean</span></code> method:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseModelFormSet</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModelFormSet</span><span class=\"p\">(</span><span class=\"n\">BaseModelFormSet</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">clean</span><span class=\"p\">()</span>\n        <span class=\"c1\"># example custom validation across forms in the formset</span>\n        <span class=\"k\">for</span> <span class=\"n\">form</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">forms</span><span class=\"p\">:</span>\n            <span class=\"c1\"># your custom formset validation</span>\n            <span class=\"o\">...</span>\n</code></pre></div>\n<p>Also note that by the time you reach this step, individual model instances\nhave already been created for each <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code>. Modifying a value in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">form.cleaned_data</span></code> is not sufficient to affect the saved value. If you wish\nto modify a value in <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelFormSet.clean()</span></code> you must modify\n<code class=\"docutils literal notranslate\"><span class=\"pre\">form.instance</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseModelFormSet</span>\n\n\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>Using a custom queryset<a class=\"heading-anchor\" href=\"#using-a-custom-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As stated earlier, you can override the default queryset used by the model\nformset:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">modelformset_factory</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n\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>Note that we pass the <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset</span></code> argument in both the <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code>\ncases in this example.</p>\n</section>\n<section id=\"using-the-formset-in-the-template\">\n<h3>Using the formset in the template<a class=\"heading-anchor\" href=\"#using-the-formset-in-the-template\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>There are three ways to render a formset in a Django template.</p>\n<p>First, you can let the formset do most of the work:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">form</span> <span class=\"na\">method</span><span class=\"o\">=</span><span class=\"s\">&quot;post&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">formset</span> <span class=\"cp\">}}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Second, you can manually render the formset, but let the form deal with\nitself:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">form</span> <span class=\"na\">method</span><span class=\"o\">=</span><span class=\"s\">&quot;post&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">formset.management_form</span> <span class=\"cp\">}}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">form</span> <span class=\"k\">in</span> <span class=\"nv\">formset</span> <span class=\"cp\">%}</span>\n        <span class=\"cp\">{{</span> <span class=\"nv\">form</span> <span class=\"cp\">}}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>When you manually render the forms yourself, be sure to render the management\nform as shown above. See the <a class=\"reference internal\" href=\"/es/6.0/topics/forms/formsets/#understanding-the-managementform\"><span class=\"std std-ref\">management form documentation</span></a>.</p>\n<p>Third, you can manually render each field:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">form</span> <span class=\"na\">method</span><span class=\"o\">=</span><span class=\"s\">&quot;post&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">formset.management_form</span> <span class=\"cp\">}}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">form</span> <span class=\"k\">in</span> <span class=\"nv\">formset</span> <span class=\"cp\">%}</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">field</span> <span class=\"k\">in</span> <span class=\"nv\">form</span> <span class=\"cp\">%}</span>\n            <span class=\"cp\">{{</span> <span class=\"nv\">field.label_tag</span> <span class=\"cp\">}}</span> <span class=\"cp\">{{</span> <span class=\"nv\">field</span> <span class=\"cp\">}}</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>If you opt to use this third method and you don’t iterate over the fields with\na <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">for</span> <span class=\"pre\">%}</span></code> loop, you’ll need to render the primary key field. For example,\nif you were rendering the <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">age</span></code> fields of a model:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">form</span> <span class=\"na\">method</span><span class=\"o\">=</span><span class=\"s\">&quot;post&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">formset.management_form</span> <span class=\"cp\">}}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">form</span> <span class=\"k\">in</span> <span class=\"nv\">formset</span> <span class=\"cp\">%}</span>\n        <span class=\"cp\">{{</span> <span class=\"nv\">form.id</span> <span class=\"cp\">}}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">form.name</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">form.age</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Notice how we need to explicitly render <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">form.id</span> <span class=\"pre\">}}</span></code>. This ensures that\nthe model formset, in the <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> case, will work correctly. (This example\nassumes a primary key named <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code>. If you’ve explicitly defined your own\nprimary key that isn’t called <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code>, make sure it gets rendered.)</p>\n</section>\n</section>\n<section id=\"inline-formsets\">\n<span id=\"id4\"></span><h2>Inline formsets<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>Inline formsets is a small abstraction layer on top of model formsets. These\nsimplify the case of working with related objects via a foreign key. Suppose\nyou have these two models:</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>If you want to create a formset that allows you to edit books belonging to\na particular author, you could do this:</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>’s <a class=\"reference internal\" href=\"/es/6.0/topics/forms/formsets/#formset-prefix\"><span class=\"std std-ref\">prefix</span></a> is <code class=\"docutils literal notranslate\"><span class=\"pre\">'book_set'</span></code>\n(<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;model</span> <span class=\"pre\">name&gt;_set</span></code> ). If <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code>’s <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> to <code class=\"docutils literal notranslate\"><span class=\"pre\">Author</span></code> has a\n<a class=\"reference internal\" href=\"/es/6.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>, that’s used instead.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p><a class=\"reference internal\" href=\"/es/6.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> uses\n<a class=\"reference internal\" href=\"/es/6.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> and marks\n<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\">Ver también</p>\n<p><a class=\"reference internal\" href=\"/es/6.0/topics/forms/formsets/#manually-rendered-can-delete-and-can-order\"><span class=\"std std-ref\">Manually rendered can_delete and can_order</span></a>.</p>\n</aside>\n<section id=\"overriding-methods-on-an-inlineformset\">\n<h3>Overriding methods on an <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>When overriding methods on <code class=\"docutils literal notranslate\"><span class=\"pre\">InlineFormSet</span></code>, you should subclass\n<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> rather than\n<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>.</p>\n<p>For example, if you want to override <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>See also <a class=\"reference internal\" href=\"#model-formsets-overriding-clean\"><span class=\"std std-ref\">Overriding clean() on a ModelFormSet</span></a>.</p>\n<p>Then when you create your inline formset, pass in the optional argument\n<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>More than one foreign key to the same model<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>If your model contains more than one foreign key to the same model, you’ll\nneed to resolve the ambiguity manually using <code class=\"docutils literal notranslate\"><span class=\"pre\">fk_name</span></code>. For example, consider\nthe following model:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"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>To resolve this, you can use <code class=\"docutils literal notranslate\"><span class=\"pre\">fk_name</span></code> to\n<a class=\"reference internal\" href=\"/es/6.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>:</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>Using an inline formset in a view<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>You may want to provide a view that allows a user to edit the related objects\nof a model. Here’s how you can do that:</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>Notice how we pass <code class=\"docutils literal notranslate\"><span class=\"pre\">instance</span></code> in both the <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> cases.</p>\n</section>\n<section id=\"specifying-widgets-to-use-in-the-inline-form\">\n<h3>Specifying widgets to use in the inline form<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> uses <code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code> and passes most\nof its arguments to <code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code>. This means you can use\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">widgets</span></code> parameter in much the same way as passing it to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">modelformset_factory</span></code>. See <a class=\"reference internal\" href=\"#specifying-widgets-to-use-in-the-form-with-widgets\">Specifying widgets to use in the form with\nwidgets</a> above.</p>\n</section>\n</section>","rootId":"creating-forms-from-models","toc":[{"title":"ModelForm","anchor":"modelform","children":[{"title":"Field types","anchor":"field-types","children":[]},{"title":"Un ejemplo completo","anchor":"a-full-example","children":[]},{"title":"Validation on a ModelForm","anchor":"validation-on-a-modelform","children":[{"title":"Overriding the clean() method","anchor":"overriding-the-clean-method","children":[]},{"title":"Interaction with model validation","anchor":"interaction-with-model-validation","children":[]},{"title":"Considerations regarding model’s error_messages","anchor":"considerations-regarding-model-s-error-messages","children":[]}]},{"title":"The save() method","anchor":"the-save-method","children":[]},{"title":"Selecting the fields to use","anchor":"selecting-the-fields-to-use","children":[]},{"title":"Overriding the default fields","anchor":"overriding-the-default-fields","children":[]},{"title":"Enabling localization of fields","anchor":"enabling-localization-of-fields","children":[]},{"title":"Form inheritance","anchor":"form-inheritance","children":[]},{"title":"Providing initial values","anchor":"providing-initial-values","children":[]},{"title":"ModelForm factory function","anchor":"modelform-factory-function","children":[]}]},{"title":"Model formsets","anchor":"model-formsets","children":[{"title":"Changing the queryset","anchor":"changing-the-queryset","children":[]},{"title":"Changing the form","anchor":"changing-the-form","children":[]},{"title":"Specifying widgets to use in the form with widgets","anchor":"specifying-widgets-to-use-in-the-form-with-widgets","children":[]},{"title":"Enabling localization for fields with localized_fields","anchor":"enabling-localization-for-fields-with-localized-fields","children":[]},{"title":"Providing initial values","anchor":"id2","children":[]},{"title":"Saving objects in the formset","anchor":"saving-objects-in-the-formset","children":[]},{"title":"Limiting the number of editable objects","anchor":"limiting-the-number-of-editable-objects","children":[]},{"title":"Preventing new objects creation","anchor":"preventing-new-objects-creation","children":[]},{"title":"Using a model formset in a view","anchor":"using-a-model-formset-in-a-view","children":[]},{"title":"Overriding clean() on a ModelFormSet","anchor":"overriding-clean-on-a-modelformset","children":[]},{"title":"Using a custom queryset","anchor":"using-a-custom-queryset","children":[]},{"title":"Using the formset in the template","anchor":"using-the-formset-in-the-template","children":[]}]},{"title":"Inline formsets","anchor":"inline-formsets","children":[{"title":"Overriding methods on an InlineFormSet","anchor":"overriding-methods-on-an-inlineformset","children":[]},{"title":"More than one foreign key to the same model","anchor":"more-than-one-foreign-key-to-the-same-model","children":[]},{"title":"Using an inline formset in a view","anchor":"using-an-inline-formset-in-a-view","children":[]},{"title":"Specifying widgets to use in the inline form","anchor":"specifying-widgets-to-use-in-the-inline-form","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Using Django","url":"/es/6.0/topics/"},{"docname":"topics/forms/index","title":"Trabajando con formularios","url":"/es/6.0/topics/forms/"}],"prev":{"docname":"topics/forms/formsets","title":"Formsets","url":"/es/6.0/topics/forms/formsets/"},"next":{"docname":"topics/forms/media","title":"Form Assets (the Media class)","url":"/es/6.0/topics/forms/media/"},"formats":{"html":"/es/6.0/topics/forms/modelforms/","markdown":"/es/6.0/topics/forms/modelforms.md","json":"/es/6.0/topics/forms/modelforms.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/forms/modelforms.txt","official":"https://docs.djangoproject.com/es/6.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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}