{"title":"Skapa formulär från modeller","version":"5.2","locale":"sv","docname":"topics/forms/modelforms","url":"/sv/5.2/topics/forms/modelforms/","canonical":"https://djangodocs.dev/sv/5.2/topics/forms/modelforms/","summary":"Om du bygger en databasdriven app är chansen stor att du har formulär som är nära kopplade till Django-modeller.","html":"<h1>Skapa formulär från modeller<a class=\"heading-anchor\" href=\"#creating-forms-from-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"modelform\">\n<h2><code class=\"docutils literal notranslate\">ModelForm</code><a class=\"heading-anchor\" href=\"#modelform\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ModelForm\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ModelForm</span><a class=\"heading-anchor\" href=\"#django.forms.ModelForm\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Om du bygger en databasdriven app är chansen stor att du har formulär som är nära kopplade till Django-modeller. Till exempel kan du ha en <code class=\"docutils literal notranslate\">BlogComment</code>-modell, och du vill skapa ett formulär som låter människor skicka in kommentarer. I det här fallet skulle det vara överflödigt att definiera fälttyperna i ditt formulär, eftersom du redan har definierat fälten i din modell.</p>\n<p>Av denna anledning tillhandahåller Django en hjälpklass som låter dig skapa en <code class=\"docutils literal notranslate\">Form</code>-klass från en Django-modell.</p>\n<p>Till exempel:</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Article\n\n<span class=\"go\"># Create the form class.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">ArticleForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>        model <span class=\"o\">=</span> Article\n<span class=\"gp\">... </span>        fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"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>form <span class=\"o\">=</span> ArticleForm<span class=\"p\">()</span>\n\n<span class=\"go\"># Creating a form to change an existing article.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>article <span class=\"o\">=</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>form <span class=\"o\">=</span> ArticleForm<span class=\"p\">(</span>instance<span class=\"o\">=</span>article<span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"field-types\">\n<span id=\"model-form-field-types\"></span><h3>Fälttyper<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>Den genererade klassen <code class=\"docutils literal notranslate\">Form</code> kommer att ha ett formulärfält för varje modellfält som anges, i den ordning som anges i attributet <code class=\"docutils literal notranslate\">fields</code>.</p>\n<p>Varje modellfält har ett motsvarande standardformulärsfält. Till exempel representeras ett <code class=\"docutils literal notranslate\">CharField</code> i en modell som ett <code class=\"docutils literal notranslate\">CharField</code> i ett formulär. En modells <code class=\"docutils literal notranslate\">ManyToManyField</code> representeras som en <code class=\"docutils literal notranslate\">MultipleChoiceField</code>. Här är den fullständiga listan över konverteringar:</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>Modellfält</p></th>\n<th class=\"head\"><p>Formulärfält</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\">AutoField</code></a></p></td>\n<td><p>Ej representerad i formuläret</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.BigAutoField\" title=\"django.db.models.BigAutoField\"><code class=\"xref py py-class docutils literal notranslate\">BigAutoField</code></a></p></td>\n<td><p>Ej representerad i formuläret</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.BigIntegerField\" title=\"django.db.models.BigIntegerField\"><code class=\"xref py py-class docutils literal notranslate\">BigIntegerField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a> med <code class=\"docutils literal notranslate\">min_value</code> satt till -9223372036854775808 och <code class=\"docutils literal notranslate\">max_value</code> satt till 9223372036854775807.</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.BinaryField\" title=\"django.db.models.BinaryField\"><code class=\"xref py py-class docutils literal notranslate\">BinaryField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a>, om <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.Field.editable\" title=\"django.db.models.Field.editable\"><code class=\"xref py py-attr docutils literal notranslate\">editable</code></a> är satt till <code class=\"docutils literal notranslate\">True</code> på modellfältet, annars inte representerad i formuläret.</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.BooleanField\" title=\"django.db.models.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\">BooleanField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.BooleanField\" title=\"django.forms.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\">BooleanField</code></a>, eller <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.NullBooleanField\" title=\"django.forms.NullBooleanField\"><code class=\"xref py py-class docutils literal notranslate\">NullBooleanField</code></a> om <code class=\"docutils literal notranslate\">null=True</code>.</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> med <code class=\"docutils literal notranslate\">max_length</code> satt till modellfältets <code class=\"docutils literal notranslate\">max_length</code> och <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.CharField.empty_value\" title=\"django.forms.CharField.empty_value\"><code class=\"xref py py-attr docutils literal notranslate\">empty_value</code></a> satt till <code class=\"docutils literal notranslate\">None</code> om <code class=\"docutils literal notranslate\">null=True</code>.</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\">DateField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.DateField\" title=\"django.forms.DateField\"><code class=\"xref py py-class docutils literal notranslate\">DateField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.DateTimeField\" title=\"django.forms.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.DecimalField\" title=\"django.db.models.DecimalField\"><code class=\"xref py py-class docutils literal notranslate\">DecimalField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.DecimalField\" title=\"django.forms.DecimalField\"><code class=\"xref py py-class docutils literal notranslate\">DecimalField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.DurationField\" title=\"django.db.models.DurationField\"><code class=\"xref py py-class docutils literal notranslate\">DurationField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.DurationField\" title=\"django.forms.DurationField\"><code class=\"xref py py-class docutils literal notranslate\">DurationField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.EmailField\" title=\"django.db.models.EmailField\"><code class=\"xref py py-class docutils literal notranslate\">EmailField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.EmailField\" title=\"django.forms.EmailField\"><code class=\"xref py py-class docutils literal notranslate\">EmailField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.FilePathField\" title=\"django.db.models.FilePathField\"><code class=\"xref py py-class docutils literal notranslate\">FilePathField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.FilePathField\" title=\"django.forms.FilePathField\"><code class=\"xref py py-class docutils literal notranslate\">FilePathField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.FloatField\" title=\"django.db.models.FloatField\"><code class=\"xref py py-class docutils literal notranslate\">FloatField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.FloatField\" title=\"django.forms.FloatField\"><code class=\"xref py py-class docutils literal notranslate\">FloatField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.ModelChoiceField\" title=\"django.forms.ModelChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ModelChoiceField</code></a> (se nedan)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.ImageField\" title=\"django.db.models.ImageField\"><code class=\"xref py py-class docutils literal notranslate\">ImageField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.ImageField\" title=\"django.forms.ImageField\"><code class=\"xref py py-class docutils literal notranslate\">ImageField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.IntegerField\" title=\"django.db.models.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\">IPAddressField</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">IPAddressField</code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"xref py py-class docutils literal notranslate\">GeneriskIPAddressField</code></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.GenericIPAddressField\" title=\"django.forms.GenericIPAddressField\"><code class=\"xref py py-class docutils literal notranslate\">GenericIPAddressField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.JSONField\" title=\"django.forms.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.ModelMultipleChoiceField\" title=\"django.forms.ModelMultipleChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ModelMultipleChoiceField</code></a> (se nedan)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"xref py py-class docutils literal notranslate\">PositivBigIntegerField</code></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"xref py py-class docutils literal notranslate\">PositivIntegerField</code></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"xref py py-class docutils literal notranslate\">Positiv LitenIntegerField</code></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.SlugField\" title=\"django.db.models.SlugField\"><code class=\"xref py py-class docutils literal notranslate\">SlugField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.SlugField\" title=\"django.forms.SlugField\"><code class=\"xref py py-class docutils literal notranslate\">SlugField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.SmallAutoField\" title=\"django.db.models.SmallAutoField\"><code class=\"xref py py-class docutils literal notranslate\">SmallAutoField</code></a></p></td>\n<td><p>Ej representerad i formuläret</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.SmallIntegerField\" title=\"django.db.models.SmallIntegerField\"><code class=\"xref py py-class docutils literal notranslate\">SmallIntegerField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.IntegerField\" title=\"django.forms.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.TextField\" title=\"django.db.models.TextField\"><code class=\"xref py py-class docutils literal notranslate\">TextField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> med <code class=\"docutils literal notranslate\">widget=forms.Textarea</code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.TimeField\" title=\"django.db.models.TimeField\"><code class=\"xref py py-class docutils literal notranslate\">TimeField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.TimeField\" title=\"django.forms.TimeField\"><code class=\"xref py py-class docutils literal notranslate\">TimeField</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.URLField\" title=\"django.db.models.URLField\"><code class=\"xref py py-class docutils literal notranslate\">URLField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.URLField\" title=\"django.forms.URLField\"><code class=\"xref py py-class docutils literal notranslate\">URLField</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.UUIDField\" title=\"django.db.models.UUIDField\"><code class=\"xref py py-class docutils literal notranslate\">UUIDField</code></a></p></td>\n<td><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.UUIDField\" title=\"django.forms.UUIDField\"><code class=\"xref py py-class docutils literal notranslate\">UUIDField</code></a></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>Som du kanske förväntar dig är modellfälttyperna <code class=\"docutils literal notranslate\">ForeignKey</code> och <code class=\"docutils literal notranslate\">ManyToManyField</code> specialfall:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">ForeignKey</code> representeras av <code class=\"docutils literal notranslate\">django.forms.ModelChoiceField</code>, som är en <code class=\"docutils literal notranslate\">ChoiceField</code> vars val är en modell <code class=\"docutils literal notranslate\">QuerySet</code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\">ManyToManyField</code> representeras av <code class=\"docutils literal notranslate\">django.forms.ModelMultipleChoiceField</code>, som är en <code class=\"docutils literal notranslate\">MultipleChoiceField</code> vars val är en modell <code class=\"docutils literal notranslate\">QuerySet</code>.</p></li>\n</ul>\n<p>Dessutom har varje genererat formulärfält attribut som är inställda enligt följande:</p>\n<ul class=\"simple\">\n<li><p>Om modellfältet har <code class=\"docutils literal notranslate\">blank=True</code>, sätts <code class=\"docutils literal notranslate\">required</code> till <code class=\"docutils literal notranslate\">False</code> på formulärfältet. Annars är <code class=\"docutils literal notranslate\">required=True</code>.</p></li>\n<li><p>Formulärfältets <code class=\"docutils literal notranslate\">label</code> sätts till modellfältets <code class=\"docutils literal notranslate\">verbose_name</code>, med det första tecknet med stor bokstav.</p></li>\n<li><p>Formulärfältets <code class=\"docutils literal notranslate\">help_text</code> sätts till modellfältets <code class=\"docutils literal notranslate\">help_text</code>.</p></li>\n<li><p>Om modellfältet har <code class=\"docutils literal notranslate\">choices</code> inställt, kommer formulärfältets <code class=\"docutils literal notranslate\">widget</code> att vara inställt på <code class=\"docutils literal notranslate\">Select</code>, med val som kommer från modellfältets <code class=\"docutils literal notranslate\">choices</code>. Valmöjligheterna inkluderar normalt det tomma valet som är valt som standard. Om fältet är obligatoriskt tvingar detta användaren att göra ett val. Det tomma valet kommer inte att inkluderas om modellfältet har <code class=\"docutils literal notranslate\">blank=False</code> och ett explicit <code class=\"docutils literal notranslate\">default</code>-värde (<code class=\"docutils literal notranslate\">default</code>-värdet kommer att väljas initialt istället).</p></li>\n</ul>\n<p>Observera slutligen att du kan åsidosätta det formulärfält som används för ett visst modellfält. Se <a class=\"reference internal\" href=\"#overriding-the-default-fields\">Overstyra standardfälten</a> nedan.</p>\n</section>\n<section id=\"a-full-example\">\n<h3>Ett fullständigt exempel<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>Tänk på denna uppsättning modeller:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm\n\nTITLE_CHOICES <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"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=\"nc\">Author</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    title <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">,</span> choices<span class=\"o\">=</span>TITLE_CHOICES<span class=\"p\">)</span>\n    birth_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">(</span>blank<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> null<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>name\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Book</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    authors <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Author<span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Author\n        fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"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=\"nc\">BookForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Book\n        fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"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>Med dessa modeller skulle <code class=\"docutils literal notranslate\">ModelForm</code>-underklasserna ovan vara ungefär likvärdiga med detta (den enda skillnaden är <code class=\"docutils literal notranslate\">save()</code>-metoden, som vi kommer att diskutera om ett ögonblick.):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    title <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>\n        max_length<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">,</span>\n        widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>Select<span class=\"p\">(</span>choices<span class=\"o\">=</span>TITLE_CHOICES<span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n    birth_date <span class=\"o\">=</span> forms<span class=\"o\">.</span>DateField<span class=\"p\">(</span>required<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">BookForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    authors <span class=\"o\">=</span> forms<span class=\"o\">.</span>ModelMultipleChoiceField<span class=\"p\">(</span>queryset<span class=\"o\">=</span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">())</span>\n</code></pre></div>\n</section>\n<section id=\"validation-on-a-modelform\">\n<span id=\"validation-on-modelform\"></span><h3>Validering på en <code class=\"docutils literal notranslate\">ModelForm</code><a class=\"heading-anchor\" href=\"#validation-on-a-modelform\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Det finns två huvudsakliga steg i valideringen av en <code class=\"docutils literal notranslate\">ModelForm</code>:</p>\n<ol class=\"arabic simple\">\n<li><p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/validation/\"><span class=\"doc\">Validering av formuläret</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/5.2/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">Validering av modellinstansen</span></a></p></li>\n</ol>\n<p>Precis som normal formulärvalidering utlöses validering av modellformulär implicit vid anrop av <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/api/#django.forms.Form.is_valid\" title=\"django.forms.Form.is_valid\"><code class=\"xref py py-meth docutils literal notranslate\">is_valid()</code></a> eller åtkomst till attributet <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/api/#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\">errors</code></a> och explicit vid anrop av <code class=\"docutils literal notranslate\">full_clean()</code>, även om du vanligtvis inte kommer att använda den senare metoden i praktiken.</p>\n<p><code class=\"docutils literal notranslate\">Model</code>-validering (<a class=\"reference internal\" href=\"/sv/5.2/ref/models/instances/#django.db.models.Model.full_clean\" title=\"django.db.models.Model.full_clean\"><code class=\"xref py py-meth docutils literal notranslate\">Model.full_clean()</code></a>) utlöses inom valideringssteget för formuläret, direkt efter att formulärets <code class=\"docutils literal notranslate\">clean()</code>-metod har anropats.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Rengöringsprocessen ändrar den modellinstans som skickas till konstruktören <code class=\"docutils literal notranslate\">ModelForm</code> på olika sätt. Till exempel konverteras alla datumfält i modellen till faktiska datumobjekt. Misslyckad validering kan lämna den underliggande modellinstansen i ett inkonsekvent tillstånd och därför rekommenderas det inte att återanvända den.</p>\n</aside>\n<section id=\"overriding-the-clean-method\">\n<span id=\"overriding-modelform-clean-method\"></span><h4>Åsidosättande av metoden <code class=\"docutils literal notranslate\">clean()</code><a class=\"heading-anchor\" href=\"#overriding-the-clean-method\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Du kan åsidosätta metoden <code class=\"docutils literal notranslate\">clean()</code> på ett modellformulär för att tillhandahålla ytterligare validering på samma sätt som du kan på ett normalt formulär.</p>\n<p>En model form-instans som är kopplad till ett model-objekt innehåller ett <code class=\"docutils literal notranslate\">instance</code>-attribut som ger dess metoder tillgång till den specifika model-instansen.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Metoden <code class=\"docutils literal notranslate\">ModelForm.clean()</code> anger en flagga som gör att steget <a class=\"reference internal\" href=\"/sv/5.2/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">modellvalidering</span></a> validerar unikheten hos modellfält som är markerade som <code class=\"docutils literal notranslate\">unique</code>, <code class=\"docutils literal notranslate\">unique_together</code> eller <code class=\"docutils literal notranslate\">unique_for_date|month|year</code>.</p>\n<p>Om du vill åsidosätta metoden <code class=\"docutils literal notranslate\">clean()</code> och behålla denna validering måste du anropa den överordnade klassens metod <code class=\"docutils literal notranslate\">clean()</code>.</p>\n</aside>\n</section>\n<section id=\"interaction-with-model-validation\">\n<h4>Samverkan med modellvalidering<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>Som en del av valideringsprocessen kommer <code class=\"docutils literal notranslate\">ModelForm</code> att anropa <code class=\"docutils literal notranslate\">clean()</code>-metoden för varje fält i din modell som har ett motsvarande fält i ditt formulär. Om du har uteslutit några modellfält kommer valideringen inte att köras på dessa fält. Se <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/validation/\"><span class=\"doc\">formulärsvalidering</span></a>-dokumentationen för mer information om hur fältrengöring och validering fungerar.</p>\n<p>Modellens metod <code class=\"docutils literal notranslate\">clean()</code> anropas innan någon unikhetskontroll görs. Se <a class=\"reference internal\" href=\"/sv/5.2/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">Validering av objekt</span></a> för mer information om modellens <code class=\"docutils literal notranslate\">clean()</code>-hook.</p>\n</section>\n<section id=\"considerations-regarding-model-s-error-messages\">\n<span id=\"considerations-regarding-model-errormessages\"></span><h4>Överväganden angående modellens <code class=\"docutils literal notranslate\">error_messages</code><a class=\"heading-anchor\" href=\"#considerations-regarding-model-s-error-messages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Felmeddelanden som definieras på nivån <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/#django.forms.Field.error_messages\" title=\"django.forms.Field.error_messages\"><code class=\"xref py py-attr docutils literal notranslate\">form field</code></a> eller på nivån <a class=\"reference internal\" href=\"#modelforms-overriding-default-fields\"><span class=\"std std-ref\">form Meta</span></a> har alltid företräde framför felmeddelanden som definieras på nivån <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.Field.error_messages\" title=\"django.db.models.Field.error_messages\"><code class=\"xref py py-attr docutils literal notranslate\">model field</code></a>.</p>\n<p>Felmeddelanden som definieras på <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.Field.error_messages\" title=\"django.db.models.Field.error_messages\"><code class=\"xref py py-attr docutils literal notranslate\">modellfält</code></a> används endast när <code class=\"docutils literal notranslate\">ValidationError</code> uppstår under <a class=\"reference internal\" href=\"/sv/5.2/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">modellvalidering</span></a> och inga motsvarande felmeddelanden har definierats på formulärnivå.</p>\n<p>Du kan åsidosätta felmeddelandena från <code class=\"docutils literal notranslate\">NON_FIELD_ERRORS</code> som uppkommer vid modellvalidering genom att lägga till <a class=\"reference internal\" href=\"/sv/5.2/ref/exceptions/#django.core.exceptions.NON_FIELD_ERRORS\" title=\"django.core.exceptions.NON_FIELD_ERRORS\"><code class=\"xref py py-data docutils literal notranslate\">NON_FIELD_ERRORS</code></a>-nyckeln i <code class=\"docutils literal notranslate\">error_messages</code>-ordlistan i <code class=\"docutils literal notranslate\">ModelForm</code>:s inre <code class=\"docutils literal notranslate\">Meta</code>-klass:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.core.exceptions</span> <span class=\"kn\">import</span> NON_FIELD_ERRORS\n<span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ArticleForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        error_messages <span class=\"o\">=</span> <span class=\"p\">{</span>\n            NON_FIELD_ERRORS<span class=\"p\">:</span> <span class=\"p\">{</span>\n                <span class=\"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>Metoden ”spara()``<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>Varje <code class=\"docutils literal notranslate\">ModelForm</code> har också en <code class=\"docutils literal notranslate\">save()</code>-metod. Denna metod skapar och sparar ett databasobjekt från de data som är bundna till formuläret. En subklass av <code class=\"docutils literal notranslate\">ModelForm</code> kan acceptera en befintlig modellinstans som nyckelordsargumentet <code class=\"docutils literal notranslate\">instance</code>; om detta tillhandahålls kommer <code class=\"docutils literal notranslate\">save()</code> att uppdatera den instansen. Om det inte anges kommer <code class=\"docutils literal notranslate\">save()</code> att skapa en ny instans av den angivna modellen:</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=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Article\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">myapp.forms</span> <span class=\"kn\">import</span> ArticleForm\n\n<span class=\"go\"># Create a form instance from POST data.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ArticleForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">)</span>\n\n<span class=\"go\"># Save a new Article object from the form&#39;s data.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>new_article <span class=\"o\">=</span> f<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"go\"># Create a form to edit an existing Article, but use</span>\n<span class=\"go\"># POST data to populate the form.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>a <span class=\"o\">=</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> ArticleForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> instance<span class=\"o\">=</span>a<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>Observera att om formuläret <a class=\"reference internal\" href=\"#validation-on-modelform\"><span class=\"std std-ref\">inte har validerats</span></a>, kommer anrop av <code class=\"docutils literal notranslate\">save()</code> att göra det genom att kontrollera <code class=\"docutils literal notranslate\">form.errors</code>. Ett <code class=\"docutils literal notranslate\">ValueError</code> kommer att uppstå om data i formuläret inte valideras – dvs. om <code class=\"docutils literal notranslate\">form.errors</code> utvärderas till <code class=\"docutils literal notranslate\">True</code>.</p>\n<p>Om ett valfritt fält inte visas i formulärets data använder den resulterande modellinstansen modellfältet <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\">default</code></a>, om det finns ett sådant, för det fältet. Detta beteende gäller inte för fält som använder <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/widgets/#django.forms.CheckboxInput\" title=\"django.forms.CheckboxInput\"><code class=\"xref py py-class docutils literal notranslate\">CheckboxInput</code></a>, <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/widgets/#django.forms.CheckboxSelectMultiple\" title=\"django.forms.CheckboxSelectMultiple\"><code class=\"xref py py-class docutils literal notranslate\">CheckboxSelectMultiple</code></a>, eller <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/widgets/#django.forms.SelectMultiple\" title=\"django.forms.SelectMultiple\"><code class=\"xref py py-class docutils literal notranslate\">SelectMultiple</code></a> (eller någon anpassad widget vars <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/widgets/#django.forms.Widget.value_omitted_from_data\" title=\"django.forms.Widget.value_omitted_from_data\"><code class=\"xref py py-meth docutils literal notranslate\">value_omitted_from_data()</code></a> alltid returnerar <code class=\"docutils literal notranslate\">False</code>) eftersom en avmarkerad kryssruta och omarkerad <code class=\"docutils literal notranslate\">&lt;select multiple&gt;</code> inte visas i data för en HTML-formulärinlämning. Använd ett anpassat formulärfält eller en widget om du utformar ett API och vill ha ett standardfallbackbeteende för ett fält som använder en av dessa widgetar.</p>\n<p>Denna metod <code class=\"docutils literal notranslate\">save()</code> accepterar ett valfritt nyckelordsargument <code class=\"docutils literal notranslate\">commit</code>, som accepterar antingen <code class=\"docutils literal notranslate\">True</code> eller <code class=\"docutils literal notranslate\">False</code>. Om du anropar <code class=\"docutils literal notranslate\">save()</code> med <code class=\"docutils literal notranslate\">commit=False</code> kommer den att returnera ett objekt som ännu inte har sparats i databasen. I det här fallet är det upp till dig att anropa <code class=\"docutils literal notranslate\">save()</code> på den resulterande modellinstansen. Detta är användbart om du vill göra anpassad bearbetning på objektet innan du sparar det, eller om du vill använda ett av de specialiserade <a class=\"reference internal\" href=\"/sv/5.2/ref/models/instances/#ref-models-force-insert\"><span class=\"std std-ref\">modellsparingsalternativen</span></a>. <code class=\"docutils literal notranslate\">commit</code> är <code class=\"docutils literal notranslate\">True</code> som standard.</p>\n<p>En annan bieffekt av att använda <code class=\"docutils literal notranslate\">commit=False</code> är när din modell har en många-till-många-relation med en annan modell. Om din modell har en many-to-many-relation och du anger <code class=\"docutils literal notranslate\">commit=False</code> när du sparar ett formulär, kan Django inte omedelbart spara formulärdata för many-to-many-relationen. Detta beror på att det inte är möjligt att spara many-to-many-data för en instans förrän instansen finns i databasen.</p>\n<p>För att komma runt detta problem lägger Django till en metod <code class=\"docutils literal notranslate\">save_m2m()</code> till din underklass <code class=\"docutils literal notranslate\">ModelForm</code> varje gång du sparar ett formulär med <code class=\"docutils literal notranslate\">commit=False</code>. När du manuellt har sparat den instans som produceras av formuläret kan du anropa <code class=\"docutils literal notranslate\">save_m2m()</code> för att spara formulärdata från många till många. Ett exempel:</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>f <span class=\"o\">=</span> AuthorForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<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>new_author <span class=\"o\">=</span> f<span class=\"o\">.</span>save<span class=\"p\">(</span>commit<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Modify the author in some way.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>new_author<span class=\"o\">.</span>some_field <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>new_author<span class=\"o\">.</span>save<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>f<span class=\"o\">.</span>save_m2m<span class=\"p\">()</span>\n</code></pre></div>\n<p>Anrop av <code class=\"docutils literal notranslate\">save_m2m()</code> krävs bara om du använder <code class=\"docutils literal notranslate\">save(commit=False)</code>. När du använder <code class=\"docutils literal notranslate\">save()</code> på ett formulär sparas alla data - även många-till-många-data - utan att du behöver göra några ytterligare metodanrop.  Ett exempel:</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>a <span class=\"o\">=</span> Author<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f <span class=\"o\">=</span> AuthorForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> instance<span class=\"o\">=</span>a<span class=\"p\">)</span>\n\n<span class=\"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>new_author <span class=\"o\">=</span> f<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>Förutom metoderna <code class=\"docutils literal notranslate\">save()</code> och <code class=\"docutils literal notranslate\">save_m2m()</code> fungerar en <code class=\"docutils literal notranslate\">ModelForm</code> på exakt samma sätt som alla andra <code class=\"docutils literal notranslate\">forms</code>-formulär. Till exempel används metoden <code class=\"docutils literal notranslate\">is_valid()</code> för att kontrollera giltigheten, metoden <code class=\"docutils literal notranslate\">is_multipart()</code> används för att avgöra om ett formulär kräver uppladdning av flera filer (och därmed om <code class=\"docutils literal notranslate\">request.FILES</code> måste skickas till formuläret), etc. Se <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/api/#binding-uploaded-files\"><span class=\"std std-ref\">Binder uppladdade filer till ett formulär</span></a> för mer information.</p>\n</section>\n<section id=\"selecting-the-fields-to-use\">\n<span id=\"modelforms-selecting-fields\"></span><h3>Välja de fält som ska användas<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>Det rekommenderas starkt att du uttryckligen anger alla fält som ska redigeras i formuläret med hjälp av attributet <code class=\"docutils literal notranslate\">fields</code>. Om man inte gör det kan det lätt leda till säkerhetsproblem när ett formulär oväntat tillåter en användare att ställa in vissa fält, särskilt när nya fält läggs till i en modell. Beroende på hur formuläret renderas kanske problemet inte ens är synligt på webbsidan.</p>\n<p>Det alternativa tillvägagångssättet skulle vara att inkludera alla fält automatiskt, eller bara ta bort vissa. Detta grundläggande tillvägagångssätt är känt för att vara mycket mindre säkert och har lett till allvarliga exploateringar på stora webbplatser (t.ex. <a class=\"reference external\" href=\"https://github.blog/2012-03-04-public-key-security-vulnerability-and-mitigation/\">GitHub</a>).</p>\n<p>Det finns dock två genvägar för de fall där du kan garantera att dessa säkerhetsproblem inte gäller dig:</p>\n<ol class=\"arabic\">\n<li><p>Sätt attributet <code class=\"docutils literal notranslate\">fields</code> till specialvärdet <code class=\"docutils literal notranslate\">'__all__'</code> för att ange att alla fält i modellen ska användas. Till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Author\n        fields <span class=\"o\">=</span> <span class=\"s2\">&quot;__all__&quot;</span>\n</code></pre></div>\n</li>\n<li><p>Ställ in attributet <code class=\"docutils literal notranslate\">exclude</code> i <code class=\"docutils literal notranslate\">ModelForm</code>:s inre <code class=\"docutils literal notranslate\">Meta</code>-klass till en lista över fält som ska uteslutas från formuläret.</p>\n<p>Till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PartialAuthorForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Author\n        exclude <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Eftersom modellen <code class=\"docutils literal notranslate\">Author</code> har de 3 fälten <code class=\"docutils literal notranslate\">name</code>, <code class=\"docutils literal notranslate\">title</code> och <code class=\"docutils literal notranslate\">birth_date</code>, kommer detta att resultera i att fälten <code class=\"docutils literal notranslate\">name</code> och <code class=\"docutils literal notranslate\">birth_date</code> finns på formuläret.</p>\n</li>\n</ol>\n<p>Om något av dessa alternativ används kommer fälten att visas i formuläret i den ordning som fälten definieras i modellen, med <code class=\"docutils literal notranslate\">ManyToManyField</code>-instanser sist.</p>\n<p>Dessutom tillämpar Django följande regel: om du ställer in <code class=\"docutils literal notranslate\">editable=False</code> på modellfältet, kommer <em>alla</em> formulär som skapas från modellen via <code class=\"docutils literal notranslate\">ModelForm</code> inte att innehålla det fältet.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Alla fält som inte inkluderas i ett formulär med ovanstående logik kommer inte att ställas in med formulärets <code class=\"docutils literal notranslate\">save()</code>-metod. Om du manuellt lägger till de uteslutna fälten i formuläret kommer de inte heller att initialiseras från modellinstansen.</p>\n<p>Django kommer att förhindra alla försök att spara en ofullständig modell, så om modellen inte tillåter att de saknade fälten är tomma och inte tillhandahåller ett standardvärde för de saknade fälten, kommer alla försök att <code class=\"docutils literal notranslate\">save()</code> en <code class=\"docutils literal notranslate\">ModelForm</code> med saknade fält att misslyckas.  För att undvika detta misslyckande måste du instansiera din modell med initiala värden för de saknade men obligatoriska fälten:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>author <span class=\"o\">=</span> Author<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;Mr&quot;</span><span class=\"p\">)</span>\nform <span class=\"o\">=</span> PartialAuthorForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> instance<span class=\"o\">=</span>author<span class=\"p\">)</span>\nform<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>Alternativt kan du använda <code class=\"docutils literal notranslate\">save(commit=False)</code> och manuellt ange eventuella extra obligatoriska fält:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>form <span class=\"o\">=</span> PartialAuthorForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">)</span>\nauthor <span class=\"o\">=</span> form<span class=\"o\">.</span>save<span class=\"p\">(</span>commit<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\nauthor<span class=\"o\">.</span>title <span class=\"o\">=</span> <span class=\"s2\">&quot;Mr&quot;</span>\nauthor<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>Se avsnittet om att spara formulär för mer information om hur du använder <code class=\"docutils literal notranslate\">save(commit=False)</code>.</p>\n</aside>\n</section>\n<section id=\"overriding-the-default-fields\">\n<span id=\"modelforms-overriding-default-fields\"></span><h3>Åsidosätta standardfälten<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>Standardfälttyperna, som beskrivs i tabellen <a class=\"reference internal\" href=\"#field-types\">Field types</a> ovan, är förnuftiga standardvärden. Om du har ett <code class=\"docutils literal notranslate\">DateField</code> i din modell är chansen stor att du vill att det ska representeras som ett <code class=\"docutils literal notranslate\">DateField</code> i ditt formulär. Men <code class=\"docutils literal notranslate\">ModelForm</code> ger dig flexibiliteten att ändra formulärfältet för en given modell.</p>\n<p>Om du vill ange en anpassad widget för ett fält använder du attributet <code class=\"docutils literal notranslate\">widgets</code> i den inre klassen <code class=\"docutils literal notranslate\">Meta</code>. Detta bör vara en ordbok som mappar fältnamn till widgetklasser eller -instanser.</p>\n<p>Om du till exempel vill att <code class=\"docutils literal notranslate\">CharField</code> för attributet <code class=\"docutils literal notranslate\">name</code> i <code class=\"docutils literal notranslate\">Author</code> ska representeras av en <code class=\"docutils literal notranslate\">&lt;textarea&gt;</code> i stället för standardvärdet <code class=\"docutils literal notranslate\">&lt;input type=&quot;text&quot;&gt;</code>, kan du åsidosätta fältets 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=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm<span class=\"p\">,</span> Textarea\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Author\n        fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"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        widgets <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> Textarea<span class=\"p\">(</span>attrs<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>Ordboken <code class=\"docutils literal notranslate\">widgets</code> accepterar antingen widgetinstanser (t.ex. <code class=\"docutils literal notranslate\">Textarea(...)</code>) eller klasser (t.ex. <code class=\"docutils literal notranslate\">Textarea</code>). Observera att <code class=\"docutils literal notranslate\">widgets</code>-dictionary ignoreras för ett modellfält med ett icke-tomt <code class=\"docutils literal notranslate\">choices</code>-attribut. I det här fallet måste du åsidosätta formulärfältet för att använda en annan widget.</p>\n<p>På samma sätt kan du ange attributen <code class=\"docutils literal notranslate\">labels</code>, <code class=\"docutils literal notranslate\">help_texts</code> och <code class=\"docutils literal notranslate\">error_messages</code> i den inre klassen <code class=\"docutils literal notranslate\">Meta</code> om du vill anpassa ett fält ytterligare.</p>\n<p>Om du till exempel vill anpassa ordalydelsen i alla strängar för fältet <code class=\"docutils literal notranslate\">namn</code> för användare:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Author\n        fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"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        labels <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;Writer&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">}</span>\n        help_texts <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</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        error_messages <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=\"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>Du kan också ange <code class=\"docutils literal notranslate\">field_classes</code> eller <code class=\"docutils literal notranslate\">formfield_callback</code> för att anpassa typen av fält som instansieras av formuläret.</p>\n<p>Om du till exempel vill använda <code class=\"docutils literal notranslate\">MySlugFormField</code> för fältet <code class=\"docutils literal notranslate\">slug</code> kan du göra följande:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Article\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ArticleForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Article\n        fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"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        field_classes <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">:</span> MySlugFormField<span class=\"p\">,</span>\n        <span class=\"p\">}</span>\n</code></pre></div>\n<p>eller:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Article\n\n\n<span class=\"k\">def</span> <span class=\"nf\">formfield_for_dbfield</span><span class=\"p\">(</span>db_field<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    <span class=\"k\">if</span> db_field<span class=\"o\">.</span>name <span class=\"o\">==</span> <span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> MySlugFormField<span class=\"p\">()</span>\n    <span class=\"k\">return</span> db_field<span class=\"o\">.</span>formfield<span class=\"p\">(</span><span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ArticleForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Article\n        fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"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        formfield_callback <span class=\"o\">=</span> formfield_for_dbfield\n</code></pre></div>\n<p>Slutligen, om du vill ha fullständig kontroll över ett fält - inklusive dess typ, validerare, obligatoriska osv. – kan du göra detta genom att deklarativt specificera fält som du skulle göra i en vanlig <code class=\"docutils literal notranslate\">Form</code>.</p>\n<p>Om du vill ange ett fälts validatorer kan du göra det genom att definiera fältet deklarativt och ange parametern <code class=\"docutils literal notranslate\">validators</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> CharField<span class=\"p\">,</span> ModelForm\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Article\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ArticleForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    slug <span class=\"o\">=</span> CharField<span class=\"p\">(</span>validators<span class=\"o\">=</span><span class=\"p\">[</span>validate_slug<span class=\"p\">])</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Article\n        fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"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\">Observera</p>\n<p>När du uttryckligen instansierar ett formulärfält på det här sättet är det viktigt att förstå hur <code class=\"docutils literal notranslate\">ModelForm</code> och vanliga <code class=\"docutils literal notranslate\">Form</code> hänger ihop.</p>\n<p><code class=\"docutils literal notranslate\">ModelForm</code> är en vanlig <code class=\"docutils literal notranslate\">Form</code> som automatiskt kan generera vissa fält. De fält som genereras automatiskt beror på innehållet i klassen <code class=\"docutils literal notranslate\">Meta</code> och på vilka fält som redan har definierats deklarativt. I grund och botten kommer <code class=\"docutils literal notranslate\">ModelForm</code> <strong>endast</strong> att generera fält som <strong>saknas</strong> i formuläret, eller med andra ord, fält som inte definierats deklarativt.</p>\n<p>Fält som definieras deklarativt lämnas som de är, och därför ignoreras alla anpassningar som gjorts av <code class=\"docutils literal notranslate\">Meta</code>-attribut som <code class=\"docutils literal notranslate\">widgets</code>, <code class=\"docutils literal notranslate\">labels</code>, <code class=\"docutils literal notranslate\">help_texts</code> eller <code class=\"docutils literal notranslate\">error_messages</code>; dessa gäller endast för fält som genereras automatiskt.</p>\n<p>På samma sätt hämtar fält som definieras deklarativt inte sina attribut som <code class=\"docutils literal notranslate\">max_length</code> eller <code class=\"docutils literal notranslate\">required</code> från motsvarande modell. Om du vill behålla det beteende som anges i modellen måste du ange de relevanta argumenten explicit när du deklarerar formulärfältet.</p>\n<p>Till exempel, om modellen <code class=\"docutils literal notranslate\">Artikel</code> ser ut så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">Article</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    headline <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>\n        max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">,</span>\n        null<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        blank<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        help_text<span class=\"o\">=</span><span class=\"s2\">&quot;Use puns liberally&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    content <span class=\"o\">=</span> models<span class=\"o\">.</span>TextField<span class=\"p\">()</span>\n</code></pre></div>\n<p>och du vill göra en anpassad validering för <code class=\"docutils literal notranslate\">headline</code>, samtidigt som du behåller värdena <code class=\"docutils literal notranslate\">blank</code> och <code class=\"docutils literal notranslate\">help_text</code> som specificerade, kan du definiera <code class=\"docutils literal notranslate\">ArticleForm</code> så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">ArticleForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n    headline <span class=\"o\">=</span> MyFormField<span class=\"p\">(</span>\n        max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">,</span>\n        required<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n        help_text<span class=\"o\">=</span><span class=\"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=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Article\n        fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"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>Du måste se till att formulärfältets typ kan användas för att ange innehållet i motsvarande modellfält. Om de inte är kompatibla kommer du att få ett <code class=\"docutils literal notranslate\">ValueError</code> eftersom ingen implicit konvertering sker.</p>\n<p>Se <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/fields/\"><span class=\"doc\">Formulärfältsdokumentation</span></a> för mer information om fält och deras argument.</p>\n</aside>\n</section>\n<section id=\"enabling-localization-of-fields\">\n<span id=\"modelforms-enabling-localization-of-fields\"></span><h3>Möjliggör lokalisering av fält<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>Som standard kommer fälten i ett <code class=\"docutils literal notranslate\">ModelForm</code> inte att lokalisera sina data. För att aktivera lokalisering för fält kan du använda attributet <code class=\"docutils literal notranslate\">localized_fields</code> på klassen <code class=\"docutils literal notranslate\">Meta</code>.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> ModelForm\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">AuthorForm</span><span class=\"p\">(</span>ModelForm<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>        model <span class=\"o\">=</span> Author\n<span class=\"gp\">... </span>        localized_fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Om <code class=\"docutils literal notranslate\">localized_fields</code> är satt till specialvärdet <code class=\"docutils literal notranslate\">'__all__'</code>, kommer alla fält att lokaliseras.</p>\n</section>\n<section id=\"form-inheritance\">\n<h3>Form av arv<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>Precis som med grundläggande formulär kan du utöka och återanvända <code class=\"docutils literal notranslate\">ModelForm</code>-klasser genom att ärva dem. Detta är användbart om du behöver deklarera extra fält eller extra metoder i en överordnad klass som ska användas i ett antal formulär som härrör från modeller. Till exempel genom att använda den tidigare klassen <code class=\"docutils literal notranslate\">ArticleForm</code>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">EnhancedArticleForm</span><span class=\"p\">(</span>ArticleForm<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">def</span> <span class=\"nf\">clean_pub_date</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n<span class=\"gp\">...</span>\n</code></pre></div>\n<p>Detta skapar ett formulär som beter sig identiskt med <code class=\"docutils literal notranslate\">ArticleForm</code>, förutom att det finns lite extra validering och rengöring för fältet <code class=\"docutils literal notranslate\">pub_date</code>.</p>\n<p>Du kan också subklassa förälderns inre klass <code class=\"docutils literal notranslate\">Meta</code> om du vill ändra listorna <code class=\"docutils literal notranslate\">Meta.fields</code> eller <code class=\"docutils literal notranslate\">Meta.exclude</code>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span> <span class=\"nc\">RestrictedArticleForm</span><span class=\"p\">(</span>EnhancedArticleForm<span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">(</span>ArticleForm<span class=\"o\">.</span>Meta<span class=\"p\">):</span>\n<span class=\"gp\">... </span>        exclude <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">]</span>\n<span class=\"gp\">...</span>\n</code></pre></div>\n<p>Detta lägger till den extra metoden från <code class=\"docutils literal notranslate\">EnhancedArticleForm</code> och ändrar den ursprungliga <code class=\"docutils literal notranslate\">ArticleForm.Meta</code> för att ta bort ett fält.</p>\n<p>Det finns dock ett par saker att notera.</p>\n<ul>\n<li><p>Normala Python-regler för namnupplösning gäller. Om du har flera basklasser som deklarerar en <code class=\"docutils literal notranslate\">Meta</code> innerklass, kommer endast den första att användas. Detta innebär barnets <code class=\"docutils literal notranslate\">Meta</code>, om det finns, annars den första förälderns <code class=\"docutils literal notranslate\">Meta</code>, etc.</p></li>\n<li><p>Det är möjligt att ärva från både <code class=\"docutils literal notranslate\">Form</code> och <code class=\"docutils literal notranslate\">ModelForm</code> samtidigt, men du måste se till att <code class=\"docutils literal notranslate\">ModelForm</code> visas först i MRO. Detta beror på att dessa klasser förlitar sig på olika metaklasser och en klass kan bara ha en metaklass.</p></li>\n<li><p>Det är möjligt att deklarativt ta bort ett <code class=\"docutils literal notranslate\">Field</code> som ärvts från en överordnad klass genom att ställa in namnet till <code class=\"docutils literal notranslate\">None</code> i underklassen.</p>\n<p>Du kan bara använda den här tekniken för att välja bort ett fält som definieras deklarativt av en överordnad klass; det hindrar inte metaklassen <code class=\"docutils literal notranslate\">ModelForm</code> från att generera ett standardfält. För att välja bort standardfält, se <a class=\"reference internal\" href=\"#modelforms-selecting-fields\"><span class=\"std std-ref\">Välja de fält som ska användas</span></a>.</p>\n</li>\n</ul>\n</section>\n<section id=\"providing-initial-values\">\n<h3>Tillhandahållande av initiala värden<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>Precis som med vanliga formulär går det att ange initiala data för formulär genom att ange en <code class=\"docutils literal notranslate\">initial</code>-parameter när formuläret instansieras. Initiala värden som anges på detta sätt åsidosätter både initiala värden från formulärfältet och värden från en ansluten modellinstans. Ett exempel:</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>article <span class=\"o\">=</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>article<span class=\"o\">.</span>headline\n<span class=\"go\">&#39;My headline&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>form <span class=\"o\">=</span> ArticleForm<span class=\"p\">(</span>initial<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Initial headline&quot;</span><span class=\"p\">},</span> instance<span class=\"o\">=</span>article<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>form<span class=\"p\">[</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">]</span><span class=\"o\">.</span>value<span class=\"p\">()</span>\n<span class=\"go\">&#39;Initial headline&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"modelform-factory-function\">\n<span id=\"modelforms-factory\"></span><h3>ModelForm fabriksfunktion<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>Du kan skapa formulär från en given modell med hjälp av den fristående funktionen <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/models/#django.forms.models.modelform_factory\" title=\"django.forms.models.modelform_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelform_factory()</code></a>, istället för att använda en klassdefinition. Detta kan vara mer praktiskt om du inte har många anpassningar att göra:</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> modelform_factory\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Book\n<span class=\"gp\">&gt;&gt;&gt; </span>BookForm <span class=\"o\">=</span> modelform_factory<span class=\"p\">(</span>Book<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>Detta kan också användas för att göra ändringar i befintliga formulär, t.ex. genom att ange vilka widgets som ska användas för ett visst fält:</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> Textarea\n<span class=\"gp\">&gt;&gt;&gt; </span>Form <span class=\"o\">=</span> modelform_factory<span class=\"p\">(</span>Book<span class=\"p\">,</span> form<span class=\"o\">=</span>BookForm<span class=\"p\">,</span> widgets<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> Textarea<span class=\"p\">()})</span>\n</code></pre></div>\n<p>De fält som ska inkluderas kan anges med hjälp av nyckelordsargumenten <code class=\"docutils literal notranslate\">fields</code> och <code class=\"docutils literal notranslate\">exclude</code>, eller motsvarande attribut på den inre <code class=\"docutils literal notranslate\">Meta</code>-klassen <code class=\"docutils literal notranslate\">ModelForm</code>. Se dokumentationen för <code class=\"docutils literal notranslate\">ModelForm</code> <a class=\"reference internal\" href=\"#modelforms-selecting-fields\"><span class=\"std std-ref\">Välja de fält som ska användas</span></a>.</p>\n<p>… eller aktivera lokalisering för specifika fält:</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>Form <span class=\"o\">=</span> modelform_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> form<span class=\"o\">=</span>AuthorForm<span class=\"p\">,</span> localized_fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;birth_date&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"model-formsets\">\n<span id=\"id1\"></span><h2>Modellformsatser<a class=\"heading-anchor\" href=\"#model-formsets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">models.</span><span class=\"sig-name descname\">BaseModelFormSet</span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Liksom <a class=\"reference internal\" href=\"/sv/5.2/topics/forms/formsets/\"><span class=\"doc\">regelbundna formulär</span></a> tillhandahåller Django ett par förbättrade formulärklasser för att göra arbetet med Django-modeller mer bekvämt. Låt oss återanvända modellen <code class=\"docutils literal notranslate\">Author</code> från ovan:</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> modelformset_factory\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n<span class=\"gp\">&gt;&gt;&gt; </span>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"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>Om du använder <code class=\"docutils literal notranslate\">fields</code> begränsas formuläret till att endast använda de angivna fälten. Alternativt kan du välja en ”opt-out”-strategi och ange vilka fält som ska uteslutas:</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>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> exclude<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;birth_date&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>Detta kommer att skapa ett formulär som kan arbeta med data som är associerade med modellen <code class=\"docutils literal notranslate\">Author</code>. Det fungerar precis som ett vanligt formulär:</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>formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>formset<span class=\"p\">)</span>\n<span class=\"go\">&lt;input type=&quot;hidden&quot; name=&quot;form-TOTAL_FORMS&quot; value=&quot;1&quot; id=&quot;id_form-TOTAL_FORMS&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;form-INITIAL_FORMS&quot; value=&quot;0&quot; id=&quot;id_form-INITIAL_FORMS&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;form-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\">Observera</p>\n<p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelformset_factory()</code></a> använder <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/formsets/#django.forms.formsets.formset_factory\" title=\"django.forms.formsets.formset_factory\"><code class=\"xref py py-func docutils literal notranslate\">formset_factory()</code></a> för att generera formulär. Detta innebär att ett modellformulär är en förlängning av ett grundläggande formulär som vet hur man interagerar med en viss modell.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>När du använder <a class=\"reference internal\" href=\"/sv/5.2/topics/db/models/#multi-table-inheritance\"><span class=\"std std-ref\">multi-table inheritance</span></a> kommer formulär som genereras av en formulärfabrik att innehålla ett fält för föräldralänk (som standard <code class=\"docutils literal notranslate\">&lt;parent_model_name&gt;_ptr</code>) i stället för ett <code class=\"docutils literal notranslate\">id</code>-fält.</p>\n</aside>\n<section id=\"changing-the-queryset\">\n<h3>Ändra 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>När du skapar ett formulär från en modell kommer formuläret som standard att använda en queryset som innehåller alla objekt i modellen (t.ex. <code class=\"docutils literal notranslate\">Author.objects.all()</code>). Du kan åsidosätta detta beteende genom att använda argumentet <code class=\"docutils literal notranslate\">queryset</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>formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>queryset<span class=\"o\">=</span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;O&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Alternativt kan du skapa en subklass som ställer in <code class=\"docutils literal notranslate\">self.queryset</code> i <code class=\"docutils literal notranslate\">__init__</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> BaseModelFormSet\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n\n\n<span class=\"k\">class</span> <span class=\"nc\">BaseAuthorFormSet</span><span class=\"p\">(</span>BaseModelFormSet<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>queryset <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;O&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Sedan skickar du din <code class=\"docutils literal notranslate\">BaseAuthorFormSet</code>-klass till fabriksfunktionen:</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>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Author<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">],</span> formset<span class=\"o\">=</span>BaseAuthorFormSet\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Om du vill returnera en formuläruppsättning som inte innehåller <em>några</em> redan existerande instanser av modellen kan du ange en tom 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>AuthorFormSet<span class=\"p\">(</span>queryset<span class=\"o\">=</span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>none<span class=\"p\">())</span>\n</code></pre></div>\n</section>\n<section id=\"changing-the-form\">\n<h3>Ändring av formuläret<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>Som standard, när du använder <code class=\"docutils literal notranslate\">modelformset_factory</code>, kommer ett modellformulär att skapas med <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/models/#django.forms.models.modelform_factory\" title=\"django.forms.models.modelform_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelform_factory()</code></a>. Ofta kan det vara användbart att ange ett anpassat modellformulär. Du kan till exempel skapa ett anpassat modellformulär som har anpassad validering:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">AuthorForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Author\n        fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"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=\"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>Skicka sedan din modellblankett till fabriksfunktionen:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> form<span class=\"o\">=</span>AuthorForm<span class=\"p\">)</span>\n</code></pre></div>\n<p>Det är inte alltid nödvändigt att definiera ett eget modellformulär. Funktionen <code class=\"docutils literal notranslate\">modelformset_factory</code> har flera argument som skickas till <code class=\"docutils literal notranslate\">modelform_factory</code> och som beskrivs nedan.</p>\n</section>\n<section id=\"specifying-widgets-to-use-in-the-form-with-widgets\">\n<h3>Ange widgets som ska användas i formuläret med <code class=\"docutils literal notranslate\">widgets</code><a class=\"heading-anchor\" href=\"#specifying-widgets-to-use-in-the-form-with-widgets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Med hjälp av parametern <code class=\"docutils literal notranslate\">widgets</code> kan du ange en ordbok med värden för att anpassa <code class=\"docutils literal notranslate\">ModelForm</code>:s widgetklass för ett visst fält. Detta fungerar på samma sätt som <code class=\"docutils literal notranslate\">widgets</code>-ordlistan på den inre <code class=\"docutils literal notranslate\">Meta</code>-klassen i en <code class=\"docutils literal notranslate\">ModelForm</code> fungerar:</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>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Author<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    fields<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>    widgets<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> Textarea<span class=\"p\">(</span>attrs<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>Aktivera lokalisering för fält med <code class=\"docutils literal notranslate\">localized_fields</code><a class=\"heading-anchor\" href=\"#enabling-localization-for-fields-with-localized-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Med hjälp av parametern <code class=\"docutils literal notranslate\">localized_fields</code> kan du aktivera lokalisering för fält i formuläret.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Author<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">],</span>\n<span class=\"gp\">... </span>    localized_fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>Om <code class=\"docutils literal notranslate\">localized_fields</code> är satt till specialvärdet <code class=\"docutils literal notranslate\">'__all__'</code>, kommer alla fält att lokaliseras.</p>\n</section>\n<section id=\"id2\">\n<h3>Tillhandahållande av initiala värden<a class=\"heading-anchor\" href=\"#id2\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Precis som med vanliga formuläruppsättningar är det möjligt att <a class=\"reference internal\" href=\"/sv/5.2/topics/forms/formsets/#formsets-initial-data\"><span class=\"std std-ref\">specificera initialdata</span></a> för formulär i formuläruppsättningen genom att ange en <code class=\"docutils literal notranslate\">initial</code>-parameter när man instansierar klassen model formset som returneras av <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelformset_factory()</code></a>. Men med modellformsatser gäller de initiala värdena endast för extra formulär, de som inte är kopplade till en befintlig modellinstans. Om längden på <code class=\"docutils literal notranslate\">initial</code> överstiger antalet extra formulär ignoreras överskottet av initiala data. Om de extra formulären med initiala data inte ändras av användaren kommer de inte att valideras eller sparas.</p>\n</section>\n<section id=\"saving-objects-in-the-formset\">\n<span id=\"id3\"></span><h3>Spara objekt i formuläret<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>Precis som med en <code class=\"docutils literal notranslate\">ModelForm</code> kan du spara data som ett modellobjekt. Detta görs med formsetets metod <code class=\"docutils literal notranslate\">save()</code>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"go\"># Create a formset instance with POST data.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<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>instances <span class=\"o\">=</span> formset<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>Metoden <code class=\"docutils literal notranslate\">save()</code> returnerar de instanser som har sparats i databasen. Om data för en viss instans inte har ändrats i de bundna data sparas inte instansen i databasen och ingår inte i returvärdet (<code class=\"docutils literal notranslate\">instances</code>, i exemplet ovan).</p>\n<p>Om fält saknas i formuläret (t.ex. för att de har uteslutits) kommer dessa fält inte att anges med metoden <code class=\"docutils literal notranslate\">save()</code>. Mer information om denna begränsning, som även gäller för vanliga modellformulär, finns i <a class=\"reference internal\" href=\"#selecting-the-fields-to-use\">Välja vilka fält som ska användas</a>.</p>\n<p>Skicka <code class=\"docutils literal notranslate\">commit=False</code> för att returnera de osparade modellinstanserna:</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>instances <span class=\"o\">=</span> formset<span class=\"o\">.</span>save<span class=\"p\">(</span>commit<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> instance <span class=\"ow\">in</span> instances<span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"c1\"># do something with instance</span>\n<span class=\"gp\">... </span>    instance<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"gp\">...</span>\n</code></pre></div>\n<p>Detta ger dig möjlighet att bifoga data till instanserna innan du sparar dem i databasen. Om ditt formulär innehåller en <code class=\"docutils literal notranslate\">ManyToManyField</code> måste du också anropa <code class=\"docutils literal notranslate\">formset.save_m2m()</code> för att säkerställa att många-till-många-relationerna sparas korrekt.</p>\n<p>När du har anropat <code class=\"docutils literal notranslate\">save()</code> kommer din formulärmodell att ha tre nya attribut som innehåller formulärets ändringar:</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet.changed_objects\">\n<span class=\"sig-prename descclassname\">models.BaseModelFormSet.</span><span class=\"sig-name descname\">changed_objects</span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet.changed_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet.deleted_objects\">\n<span class=\"sig-prename descclassname\">models.BaseModelFormSet.</span><span class=\"sig-name descname\">deleted_objects</span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet.deleted_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseModelFormSet.new_objects\">\n<span class=\"sig-prename descclassname\">models.BaseModelFormSet.</span><span class=\"sig-name descname\">new_objects</span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseModelFormSet.new_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</section>\n<section id=\"limiting-the-number-of-editable-objects\">\n<span id=\"model-formsets-max-num\"></span><h3>Begränsa antalet redigerbara objekt<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>Precis som med vanliga formuläruppsättningar kan du använda parametrarna <code class=\"docutils literal notranslate\">max_num</code> och <code class=\"docutils literal notranslate\">extra</code> till <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelformset_factory()</code></a> för att begränsa antalet extra formulär som visas.</p>\n<p><code class=\"docutils literal notranslate\">max_num</code> förhindrar inte att befintliga objekt visas:</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>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<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>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">],</span> max_num<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>queryset<span class=\"o\">=</span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"p\">[</span>x<span class=\"o\">.</span>name <span class=\"k\">for</span> x <span class=\"ow\">in</span> formset<span class=\"o\">.</span>get_queryset<span class=\"p\">()]</span>\n<span class=\"go\">[&#39;Charles Baudelaire&#39;, &#39;Paul Verlaine&#39;, &#39;Walt Whitman&#39;]</span>\n</code></pre></div>\n<p>Dessutom hindrar inte <code class=\"docutils literal notranslate\">extra=0</code> skapandet av nya modellinstanser eftersom du kan <a class=\"reference internal\" href=\"/sv/5.2/topics/forms/formsets/#understanding-the-managementform\"><span class=\"std std-ref\">lägga till ytterligare formulär med JavaScript</span></a> eller skicka ytterligare POST-data. Se <a class=\"reference internal\" href=\"#model-formsets-edit-only\"><span class=\"std std-ref\">Förhindrar att nya objekt skapas</span></a> om hur man gör detta.</p>\n<p>Om värdet för <code class=\"docutils literal notranslate\">max_num</code> är större än antalet befintliga relaterade objekt, kommer upp till <code class=\"docutils literal notranslate\">extra</code> ytterligare tomma formulär att läggas till i formuläruppsättningen, så länge det totala antalet formulär inte överstiger <code class=\"docutils literal notranslate\">max_num</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>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">],</span> max_num<span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">,</span> extra<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>queryset<span class=\"o\">=</span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> form <span class=\"ow\">in</span> formset<span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span>form<span class=\"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>Ett värde på <code class=\"docutils literal notranslate\">max_num</code> på <code class=\"docutils literal notranslate\">None</code> (standard) sätter en hög gräns för antalet formulär som visas (1000). I praktiken är detta likvärdigt med ingen gräns.</p>\n</section>\n<section id=\"preventing-new-objects-creation\">\n<span id=\"model-formsets-edit-only\"></span><h3>Förhindrar att nya objekt skapas<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>Med hjälp av parametern <code class=\"docutils literal notranslate\">edit_only</code> kan du förhindra att nya objekt skapas:</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>AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Author<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    fields<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>    edit_only<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>Här kommer formuläret endast att redigera befintliga <code class=\"docutils literal notranslate\">Author</code>-instanser. Inga andra objekt kommer att skapas eller redigeras.</p>\n</section>\n<section id=\"using-a-model-formset-in-a-view\">\n<h3>Använda en formulärmodell i en vy<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>Modellformulären är mycket lika formulären. Låt oss säga att vi vill presentera ett formulär för att redigera <code class=\"docutils literal notranslate\">Author</code> modellinstanser:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> modelformset_factory\n<span class=\"kn\">from</span> <span class=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n\n\n<span class=\"k\">def</span> <span class=\"nf\">manage_authors</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"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> request<span class=\"o\">.</span>method <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> request<span class=\"o\">.</span>FILES<span class=\"p\">)</span>\n        <span class=\"k\">if</span> formset<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            formset<span class=\"o\">.</span>save<span class=\"p\">()</span>\n            <span class=\"c1\"># do something.</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">()</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"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> formset<span class=\"p\">})</span>\n</code></pre></div>\n<p>Som du kan se är visningslogiken för ett modellformulär inte drastiskt annorlunda än för ett ”vanligt” formulär. Den enda skillnaden är att vi anropar <code class=\"docutils literal notranslate\">formset.save()</code> för att spara data i databasen. (Detta beskrevs ovan, i <a class=\"reference internal\" href=\"#saving-objects-in-the-formset\"><span class=\"std std-ref\">Spara objekt i formuläret</span></a>.)</p>\n</section>\n<section id=\"overriding-clean-on-a-modelformset\">\n<span id=\"model-formsets-overriding-clean\"></span><h3>Åsidosätta <code class=\"docutils literal notranslate\">clean()</code> på en <code class=\"docutils literal notranslate\">ModelFormSet</code><a class=\"heading-anchor\" href=\"#overriding-clean-on-a-modelformset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Precis som med en <code class=\"docutils literal notranslate\">ModelForm</code> kommer som standard <code class=\"docutils literal notranslate\">clean()</code>-metoden för en <code class=\"docutils literal notranslate\">ModelFormSet</code> att validera att inget av objekten i formuläret bryter mot de unika begränsningarna i din modell (antingen <code class=\"docutils literal notranslate\">unique</code>, <code class=\"docutils literal notranslate\">unique_together</code> eller <code class=\"docutils literal notranslate\">unique_for_date|month|year</code>).  Om du vill åsidosätta metoden <code class=\"docutils literal notranslate\">clean()</code> på en <code class=\"docutils literal notranslate\">ModelFormSet</code> och behålla denna validering måste du anropa den överordnade klassens metod <code class=\"docutils literal notranslate\">clean</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> BaseModelFormSet\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModelFormSet</span><span class=\"p\">(</span>BaseModelFormSet<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>clean<span class=\"p\">()</span>\n        <span class=\"c1\"># example custom validation across forms in the formset</span>\n        <span class=\"k\">for</span> form <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>forms<span class=\"p\">:</span>\n            <span class=\"c1\"># your custom formset validation</span>\n            <span class=\"o\">...</span>\n</code></pre></div>\n<p>Observera också att när du kommer till det här steget har individuella modellinstanser redan skapats för varje <code class=\"docutils literal notranslate\">Form</code>. Att ändra ett värde i <code class=\"docutils literal notranslate\">form.cleaned_data</code> är inte tillräckligt för att påverka det sparade värdet. Om du vill ändra ett värde i <code class=\"docutils literal notranslate\">ModelFormSet.clean()</code> måste du ändra <code class=\"docutils literal notranslate\">form.instance</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> BaseModelFormSet\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModelFormSet</span><span class=\"p\">(</span>BaseModelFormSet<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>clean<span class=\"p\">()</span>\n\n        <span class=\"k\">for</span> form <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>forms<span class=\"p\">:</span>\n            name <span class=\"o\">=</span> form<span class=\"o\">.</span>cleaned_data<span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">]</span><span class=\"o\">.</span>upper<span class=\"p\">()</span>\n            form<span class=\"o\">.</span>cleaned_data<span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> name\n            <span class=\"c1\"># update the instance value.</span>\n            form<span class=\"o\">.</span>instance<span class=\"o\">.</span>name <span class=\"o\">=</span> name\n</code></pre></div>\n</section>\n<section id=\"using-a-custom-queryset\">\n<h3>Använda en anpassad 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>Som tidigare nämnts kan du åsidosätta den förvalda queryset som används av modellen formset:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> modelformset_factory\n<span class=\"kn\">from</span> <span class=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n\n\n<span class=\"k\">def</span> <span class=\"nf\">manage_authors</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    AuthorFormSet <span class=\"o\">=</span> modelformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">])</span>\n    queryset <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;O&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> request<span class=\"o\">.</span>method <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>\n            request<span class=\"o\">.</span>POST<span class=\"p\">,</span>\n            request<span class=\"o\">.</span>FILES<span class=\"p\">,</span>\n            queryset<span class=\"o\">=</span>queryset<span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n        <span class=\"k\">if</span> formset<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            formset<span class=\"o\">.</span>save<span class=\"p\">()</span>\n            <span class=\"c1\"># Do something.</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        formset <span class=\"o\">=</span> AuthorFormSet<span class=\"p\">(</span>queryset<span class=\"o\">=</span>queryset<span class=\"p\">)</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<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> formset<span class=\"p\">})</span>\n</code></pre></div>\n<p>Observera att vi skickar argumentet <code class=\"docutils literal notranslate\">queryset</code> i både <code class=\"docutils literal notranslate\">POST</code> och <code class=\"docutils literal notranslate\">GET</code>-fallen i detta exempel.</p>\n</section>\n<section id=\"using-the-formset-in-the-template\">\n<h3>Använda formuläret i mallen<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>Det finns tre sätt att rendera en formuläruppsättning i en Django-mall.</p>\n<p>För det första kan du låta formuläret göra det mesta av jobbet:</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>För det andra kan du manuellt rendera formuläruppsättningen, men låta formuläret sköta sig självt:</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>När du manuellt renderar formulären själv, se till att rendera förvaltningsformuläret enligt ovan. Se <a class=\"reference internal\" href=\"/sv/5.2/topics/forms/formsets/#understanding-the-managementform\"><span class=\"std std-ref\">dokumentation för förvaltningsformulär</span></a>.</p>\n<p>För det tredje kan du göra en manuell rendering av varje fält:</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>Om du väljer att använda den här tredje metoden och inte itererar över fälten med en <code class=\"docutils literal notranslate\">{% feller %}</code>-loop, måste du rendera fältet för primärnyckeln. Om du till exempel skulle rendera fälten <code class=\"docutils literal notranslate\">namn</code> och <code class=\"docutils literal notranslate\">ålder</code> i en modell:</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>Lägg märke till hur vi uttryckligen måste rendera <code class=\"docutils literal notranslate\">{{ form.id }}</code>. Detta säkerställer att modellformuläret, i fallet <code class=\"docutils literal notranslate\">POST</code>, kommer att fungera korrekt. (I det här exemplet antas en primärnyckel med namnet <code class=\"docutils literal notranslate\">id</code>. Om du uttryckligen har definierat din egen primärnyckel som inte heter <code class=\"docutils literal notranslate\">id</code>, se till att den renderas)</p>\n</section>\n</section>\n<section id=\"inline-formsets\">\n<span id=\"id4\"></span><h2>Inline-formulär<a class=\"heading-anchor\" href=\"#inline-formsets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.models.BaseInlineFormSet\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">models.</span><span class=\"sig-name descname\">BaseInlineFormSet</span><a class=\"heading-anchor\" href=\"#django.forms.models.BaseInlineFormSet\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Inline-formulär är ett litet abstraktionslager ovanpå modellformulären. Dessa förenklar fallet med att arbeta med relaterade objekt via en främmande nyckel. Anta att du har dessa två modeller:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Author</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Book</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    author <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Author<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    title <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Om du vill skapa ett formulär som gör att du kan redigera böcker som tillhör en viss författare kan du göra så här:</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> inlineformset_factory\n<span class=\"gp\">&gt;&gt;&gt; </span>BookFormSet <span class=\"o\">=</span> inlineformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> Book<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>author <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Mike Royko&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>formset <span class=\"o\">=</span> BookFormSet<span class=\"p\">(</span>instance<span class=\"o\">=</span>author<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">BookFormSet</code> s <a class=\"reference internal\" href=\"/sv/5.2/topics/forms/formsets/#formset-prefix\"><span class=\"std std-ref\">prefix</span></a> är <code class=\"docutils literal notranslate\">'book_set'</code> (<code class=\"docutils literal notranslate\">&lt;model name&gt;_set</code> ). Om <code class=\"docutils literal notranslate\">Book</code>’s <code class=\"docutils literal notranslate\">ForeignKey</code> till <code class=\"docutils literal notranslate\">Author</code> har en <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\">related_name</code></a>, används den istället.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p><a class=\"reference internal\" href=\"/sv/5.2/ref/forms/models/#django.forms.models.inlineformset_factory\" title=\"django.forms.models.inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">inlineformset_factory()</code></a> använder <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelformset_factory()</code></a> och markerar <code class=\"docutils literal notranslate\">can_delete=True</code>.</p>\n</aside>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">Se även</p>\n<p><a class=\"reference internal\" href=\"/sv/5.2/topics/forms/formsets/#manually-rendered-can-delete-and-can-order\"><span class=\"std std-ref\">Manuell rendering av can_delete och can_order</span></a>.</p>\n</aside>\n<section id=\"overriding-methods-on-an-inlineformset\">\n<h3>Åsidosätta metoder för en <code class=\"docutils literal notranslate\">InlineFormSet</code><a class=\"heading-anchor\" href=\"#overriding-methods-on-an-inlineformset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>När du åsidosätter metoder på <code class=\"docutils literal notranslate\">InlineFormSet</code> bör du underordna dig <a class=\"reference internal\" href=\"#django.forms.models.BaseInlineFormSet\" title=\"django.forms.models.BaseInlineFormSet\"><code class=\"xref py py-class docutils literal notranslate\">BaseInlineFormSet</code></a> snarare än <a class=\"reference internal\" href=\"#django.forms.models.BaseModelFormSet\" title=\"django.forms.models.BaseModelFormSet\"><code class=\"xref py py-class docutils literal notranslate\">BaseModelFormSet</code></a>.</p>\n<p>Till exempel, om du vill åsidosätta <code class=\"docutils literal notranslate\">clean()</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> BaseInlineFormSet\n\n\n<span class=\"k\">class</span> <span class=\"nc\">CustomInlineFormSet</span><span class=\"p\">(</span>BaseInlineFormSet<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>clean<span class=\"p\">()</span>\n        <span class=\"c1\"># example custom validation across forms in the formset</span>\n        <span class=\"k\">for</span> form <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>forms<span class=\"p\">:</span>\n            <span class=\"c1\"># your custom formset validation</span>\n            <span class=\"o\">...</span>\n</code></pre></div>\n<p>Se även <a class=\"reference internal\" href=\"#model-formsets-overriding-clean\"><span class=\"std std-ref\">Åsidosätta clean() på en ModelFormSet</span></a>.</p>\n<p>När du sedan skapar din inline-formulärsats skickar du in det valfria argumentet <code class=\"docutils literal notranslate\">formulärsats</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> inlineformset_factory\n<span class=\"gp\">&gt;&gt;&gt; </span>BookFormSet <span class=\"o\">=</span> inlineformset_factory<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Author<span class=\"p\">,</span> Book<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">],</span> formset<span class=\"o\">=</span>CustomInlineFormSet\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>author <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Mike Royko&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>formset <span class=\"o\">=</span> BookFormSet<span class=\"p\">(</span>instance<span class=\"o\">=</span>author<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"more-than-one-foreign-key-to-the-same-model\">\n<h3>Mer än en främmande nyckel till samma modell<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>Om din modell innehåller mer än en främmande nyckel till samma modell måste du lösa tvetydigheten manuellt med hjälp av <code class=\"docutils literal notranslate\">fk_name</code>. Tänk till exempel på följande modell:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">Friendship</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    from_friend <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        Friend<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n        related_name<span class=\"o\">=</span><span class=\"s2\">&quot;from_friends&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    to_friend <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        Friend<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n        related_name<span class=\"o\">=</span><span class=\"s2\">&quot;friends&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    length_in_months <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n</code></pre></div>\n<p>För att lösa detta kan du använda <code class=\"docutils literal notranslate\">fk_name</code> till <a class=\"reference internal\" href=\"/sv/5.2/ref/forms/models/#django.forms.models.inlineformset_factory\" title=\"django.forms.models.inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">inlineformset_factory()</code></a>:</p>\n<div class=\"code-block\" data-language=\"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>FriendshipFormSet <span class=\"o\">=</span> inlineformset_factory<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Friend<span class=\"p\">,</span> Friendship<span class=\"p\">,</span> fk_name<span class=\"o\">=</span><span class=\"s2\">&quot;from_friend&quot;</span><span class=\"p\">,</span> fields<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>Använda en inline-formulärsats i en vy<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>Du kanske vill tillhandahålla en vy som gör det möjligt för en användare att redigera de relaterade objekten i en modell. Så här kan du göra det:</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=\"nf\">manage_books</span><span class=\"p\">(</span>request<span class=\"p\">,</span> author_id<span class=\"p\">):</span>\n    author <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span>author_id<span class=\"p\">)</span>\n    BookInlineFormSet <span class=\"o\">=</span> inlineformset_factory<span class=\"p\">(</span>Author<span class=\"p\">,</span> Book<span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">])</span>\n    <span class=\"k\">if</span> request<span class=\"o\">.</span>method <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        formset <span class=\"o\">=</span> BookInlineFormSet<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> request<span class=\"o\">.</span>FILES<span class=\"p\">,</span> instance<span class=\"o\">=</span>author<span class=\"p\">)</span>\n        <span class=\"k\">if</span> formset<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            formset<span class=\"o\">.</span>save<span class=\"p\">()</span>\n            <span class=\"c1\"># Do something. Should generally end with a redirect. For example:</span>\n            <span class=\"k\">return</span> HttpResponseRedirect<span class=\"p\">(</span>author<span class=\"o\">.</span>get_absolute_url<span class=\"p\">())</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        formset <span class=\"o\">=</span> BookInlineFormSet<span class=\"p\">(</span>instance<span class=\"o\">=</span>author<span class=\"p\">)</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"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> formset<span class=\"p\">})</span>\n</code></pre></div>\n<p>Notera hur vi skickar <code class=\"docutils literal notranslate\">instance</code> i både <code class=\"docutils literal notranslate\">POST</code> och <code class=\"docutils literal notranslate\">GET</code> fallen.</p>\n</section>\n<section id=\"specifying-widgets-to-use-in-the-inline-form\">\n<h3>Ange widgetar som ska användas i inline-formuläret<a class=\"heading-anchor\" href=\"#specifying-widgets-to-use-in-the-inline-form\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\">inlineformset_factory</code> använder <code class=\"docutils literal notranslate\">modelformset_factory</code> och skickar de flesta av sina argument till <code class=\"docutils literal notranslate\">modelformset_factory</code>. Detta innebär att du kan använda parametern <code class=\"docutils literal notranslate\">widgets</code> på ungefär samma sätt som när du skickar den till <code class=\"docutils literal notranslate\">modelformset_factory</code>. Se <a class=\"reference internal\" href=\"#specifying-widgets-to-use-in-the-form-with-widgets\">Specificera widgets som ska användas i formuläret med widgets</a> ovan.</p>\n</section>\n</section>","rootId":"creating-forms-from-models","toc":[{"title":"ModelForm","anchor":"modelform","children":[{"title":"Fälttyper","anchor":"field-types","children":[]},{"title":"Ett fullständigt exempel","anchor":"a-full-example","children":[]},{"title":"Validering på en ModelForm","anchor":"validation-on-a-modelform","children":[{"title":"Åsidosättande av metoden clean()","anchor":"overriding-the-clean-method","children":[]},{"title":"Samverkan med modellvalidering","anchor":"interaction-with-model-validation","children":[]},{"title":"Överväganden angående modellens error_messages","anchor":"considerations-regarding-model-s-error-messages","children":[]}]},{"title":"Metoden ”spara()``","anchor":"the-save-method","children":[]},{"title":"Välja de fält som ska användas","anchor":"selecting-the-fields-to-use","children":[]},{"title":"Åsidosätta standardfälten","anchor":"overriding-the-default-fields","children":[]},{"title":"Möjliggör lokalisering av fält","anchor":"enabling-localization-of-fields","children":[]},{"title":"Form av arv","anchor":"form-inheritance","children":[]},{"title":"Tillhandahållande av initiala värden","anchor":"providing-initial-values","children":[]},{"title":"ModelForm fabriksfunktion","anchor":"modelform-factory-function","children":[]}]},{"title":"Modellformsatser","anchor":"model-formsets","children":[{"title":"Ändra queryset","anchor":"changing-the-queryset","children":[]},{"title":"Ändring av formuläret","anchor":"changing-the-form","children":[]},{"title":"Ange widgets som ska användas i formuläret med widgets","anchor":"specifying-widgets-to-use-in-the-form-with-widgets","children":[]},{"title":"Aktivera lokalisering för fält med localized_fields","anchor":"enabling-localization-for-fields-with-localized-fields","children":[]},{"title":"Tillhandahållande av initiala värden","anchor":"id2","children":[]},{"title":"Spara objekt i formuläret","anchor":"saving-objects-in-the-formset","children":[]},{"title":"Begränsa antalet redigerbara objekt","anchor":"limiting-the-number-of-editable-objects","children":[]},{"title":"Förhindrar att nya objekt skapas","anchor":"preventing-new-objects-creation","children":[]},{"title":"Använda en formulärmodell i en vy","anchor":"using-a-model-formset-in-a-view","children":[]},{"title":"Åsidosätta clean() på en ModelFormSet","anchor":"overriding-clean-on-a-modelformset","children":[]},{"title":"Använda en anpassad queryset","anchor":"using-a-custom-queryset","children":[]},{"title":"Använda formuläret i mallen","anchor":"using-the-formset-in-the-template","children":[]}]},{"title":"Inline-formulär","anchor":"inline-formsets","children":[{"title":"Åsidosätta metoder för en InlineFormSet","anchor":"overriding-methods-on-an-inlineformset","children":[]},{"title":"Mer än en främmande nyckel till samma modell","anchor":"more-than-one-foreign-key-to-the-same-model","children":[]},{"title":"Använda en inline-formulärsats i en vy","anchor":"using-an-inline-formset-in-a-view","children":[]},{"title":"Ange widgetar som ska användas i inline-formuläret","anchor":"specifying-widgets-to-use-in-the-inline-form","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/5.2/topics/"},{"docname":"topics/forms/index","title":"Arbeta med formulär","url":"/sv/5.2/topics/forms/"}],"prev":{"docname":"topics/forms/formsets","title":"Formsatser","url":"/sv/5.2/topics/forms/formsets/"},"next":{"docname":"topics/forms/media","title":"Formtillgångar (klassen ”Media”)","url":"/sv/5.2/topics/forms/media/"},"formats":{"html":"/sv/5.2/topics/forms/modelforms/","markdown":"/sv/5.2/topics/forms/modelforms.md","json":"/sv/5.2/topics/forms/modelforms.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/topics/forms/modelforms.txt","official":"https://docs.djangoproject.com/sv/5.2/topics/forms/modelforms/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}