{"title":"Formulärhantering med klassbaserade vyer","version":"6.0","locale":"sv","docname":"topics/class-based-views/generic-editing","url":"/sv/6.0/topics/class-based-views/generic-editing/","canonical":"https://djangodocs.dev/sv/6.0/topics/class-based-views/generic-editing/","summary":"Formulärhantering har i allmänhet 3 vägar: Initial GET (blankett eller förifyllt formulär); POST med ogiltiga data (vanligtvis visas formuläret på nytt med…","html":"<h1>Formulärhantering med klassbaserade vyer<a class=\"heading-anchor\" href=\"#form-handling-with-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Formulärhantering har i allmänhet 3 vägar:</p>\n<ul class=\"simple\">\n<li><p>Initial GET (blankett eller förifyllt formulär)</p></li>\n<li><p>POST med ogiltiga data (vanligtvis visas formuläret på nytt med fel)</p></li>\n<li><p>POST med giltiga data (bearbeta data och typiskt omdirigera)</p></li>\n</ul>\n<p>Att implementera detta själv resulterar ofta i en hel del upprepad boilerplate-kod (se <a class=\"reference internal\" href=\"/sv/6.0/topics/forms/#using-a-form-in-a-view\"><span class=\"std std-ref\">Använda ett formulär i en vy</span></a>). För att hjälpa till att undvika detta tillhandahåller Django en samling generiska klassbaserade vyer för formulärbehandling.</p>\n<section id=\"basic-forms\">\n<h2>Grundläggande former<a class=\"heading-anchor\" href=\"#basic-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Givet ett kontaktformulär:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">forms.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ContactForm</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>\n    message <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>Textarea<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">send_email</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># send email using the self.cleaned_data dictionary</span>\n        <span class=\"k\">pass</span>\n</code></pre></figure>\n<p>Vyn kan byggas upp med hjälp av en <code class=\"docutils literal notranslate\">FormView</code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">Vyer.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">myapp.forms</span> <span class=\"kn\">import</span> ContactForm\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.edit</span> <span class=\"kn\">import</span> FormView\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ContactFormView</span><span class=\"p\">(</span>FormView<span class=\"p\">):</span>\n    template_name <span class=\"o\">=</span> <span class=\"s2\">&quot;contact.html&quot;</span>\n    form_class <span class=\"o\">=</span> ContactForm\n    success_url <span class=\"o\">=</span> <span class=\"s2\">&quot;/thanks/&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">form_valid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> form<span class=\"p\">):</span>\n        <span class=\"c1\"># This method is called when valid form data has been POSTed.</span>\n        <span class=\"c1\"># It should return an HttpResponse.</span>\n        form<span class=\"o\">.</span>send_email<span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>form_valid<span class=\"p\">(</span>form<span class=\"p\">)</span>\n</code></pre></figure>\n<p>Anteckningar:</p>\n<ul class=\"simple\">\n<li><p>FormView ärver <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin\" title=\"django.views.generic.base.TemplateResponseMixin\"><code class=\"xref py py-class docutils literal notranslate\">TemplateResponseMixin</code></a> så <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.template_name\" title=\"django.views.generic.base.TemplateResponseMixin.template_name\"><code class=\"xref py py-attr docutils literal notranslate\">template_name</code></a> kan användas här.</p></li>\n<li><p>Standardimplementeringen för <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.form_valid\" title=\"django.views.generic.edit.FormMixin.form_valid\"><code class=\"xref py py-meth docutils literal notranslate\">form_valid()</code></a> omdirigerar helt enkelt till <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.success_url\" title=\"django.views.generic.edit.FormMixin.success_url\"><code class=\"xref py py-attr docutils literal notranslate\">success_url</code></a>.</p></li>\n</ul>\n</section>\n<section id=\"model-forms\">\n<h2>Modellformer<a class=\"heading-anchor\" href=\"#model-forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Generic views really shine when working with models. These generic\nviews will automatically create a <a class=\"reference internal\" href=\"/sv/6.0/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a>, so long as\nthey can work out which model class to use:</p>\n<ul class=\"simple\">\n<li><p>Om attributet <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin.model\" title=\"django.views.generic.edit.ModelFormMixin.model\"><code class=\"xref py py-attr docutils literal notranslate\">model</code></a> anges kommer den modellklassen att användas.</p></li>\n<li><p>If <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_object\" title=\"django.views.generic.detail.SingleObjectMixin.get_object\"><code class=\"xref py py-meth docutils literal notranslate\">get_object()</code></a>\nreturns an object, the class of that object will be used.</p></li>\n<li><p>Om en <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.queryset\" title=\"django.views.generic.detail.SingleObjectMixin.queryset\"><code class=\"xref py py-attr docutils literal notranslate\">queryset</code></a> anges, kommer modellen för den queryset att användas.</p></li>\n</ul>\n<p>Model form views provide a\n<a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin.form_valid\" title=\"django.views.generic.edit.ModelFormMixin.form_valid\"><code class=\"xref py py-meth docutils literal notranslate\">form_valid()</code></a> implementation\nthat saves the model automatically. You can override this if you have any\nspecial requirements; see below for examples.</p>\n<p>You don’t even need to provide a <code class=\"docutils literal notranslate\">success_url</code> for\n<a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/generic-editing/#django.views.generic.edit.CreateView\" title=\"django.views.generic.edit.CreateView\"><code class=\"xref py py-class docutils literal notranslate\">CreateView</code></a> or\n<a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/generic-editing/#django.views.generic.edit.UpdateView\" title=\"django.views.generic.edit.UpdateView\"><code class=\"xref py py-class docutils literal notranslate\">UpdateView</code></a> - they will use\n<a class=\"reference internal\" href=\"/sv/6.0/ref/models/instances/#django.db.models.Model.get_absolute_url\" title=\"django.db.models.Model.get_absolute_url\"><code class=\"xref py py-meth docutils literal notranslate\">get_absolute_url()</code></a> on the model object if\navailable.</p>\n<p>Om du vill använda en anpassad <a class=\"reference internal\" href=\"/sv/6.0/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a> (t.ex. för att lägga till extra validering), ange <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.form_class\" title=\"django.views.generic.edit.FormMixin.form_class\"><code class=\"xref py py-attr docutils literal notranslate\">form_class</code></a> på din vy.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>När du anger en anpassad formulärklass måste du fortfarande ange modellen, även om <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.form_class\" title=\"django.views.generic.edit.FormMixin.form_class\"><code class=\"xref py py-attr docutils literal notranslate\">form_class</code></a> kan vara en <a class=\"reference internal\" href=\"/sv/6.0/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a>.</p>\n</aside>\n<p>First we need to add <a class=\"reference internal\" href=\"/sv/6.0/ref/models/instances/#django.db.models.Model.get_absolute_url\" title=\"django.db.models.Model.get_absolute_url\"><code class=\"xref py py-meth docutils literal notranslate\">get_absolute_url()</code></a> to our\n<code class=\"docutils literal notranslate\">Author</code> class:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">modeller.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> reverse\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\">200</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_absolute_url</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> reverse<span class=\"p\">(</span><span class=\"s2\">&quot;author-detail&quot;</span><span class=\"p\">,</span> kwargs<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span>pk<span class=\"p\">})</span>\n</code></pre></figure>\n<p>Sedan kan vi använda <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/flattened-index/#CreateView\" title=\"CreateView\"><code class=\"xref py py-class docutils literal notranslate\">CreateView</code></a> och dess vänner för att göra det faktiska arbetet. Lägg märke till hur vi bara konfigurerar de generiska klassbaserade vyerna här; vi behöver inte skriva någon logik själva:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">Vyer.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> reverse_lazy\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.edit</span> <span class=\"kn\">import</span> CreateView<span class=\"p\">,</span> DeleteView<span class=\"p\">,</span> UpdateView\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\">AuthorCreateView</span><span class=\"p\">(</span>CreateView<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>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorUpdateView</span><span class=\"p\">(</span>UpdateView<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>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorDeleteView</span><span class=\"p\">(</span>DeleteView<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Author\n    success_url <span class=\"o\">=</span> reverse_lazy<span class=\"p\">(</span><span class=\"s2\">&quot;author-list&quot;</span><span class=\"p\">)</span>\n</code></pre></figure>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Vi måste använda <a class=\"reference internal\" href=\"/sv/6.0/ref/urlresolvers/#django.urls.reverse_lazy\" title=\"django.urls.reverse_lazy\"><code class=\"xref py py-func docutils literal notranslate\">reverse_lazy()</code></a> istället för <code class=\"docutils literal notranslate\">reverse()</code>, eftersom webbadresserna inte laddas när filen importeras.</p>\n</aside>\n<p>Attributet <code class=\"docutils literal notranslate\">fields</code> fungerar på samma sätt som attributet <code class=\"docutils literal notranslate\">fields</code> på den inre <code class=\"docutils literal notranslate\">Meta</code> klassen på <a class=\"reference internal\" href=\"/sv/6.0/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a>. Om du inte definierar formulärklassen på ett annat sätt krävs attributet och vyn kommer att ge upphov till ett <a class=\"reference internal\" href=\"/sv/6.0/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-exc docutils literal notranslate\">ImproperlyConfigured</code></a> undantag om det inte är det.</p>\n<p>Om du anger både attributen <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin.fields\" title=\"django.views.generic.edit.ModelFormMixin.fields\"><code class=\"xref py py-attr docutils literal notranslate\">fields</code></a> och <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.form_class\" title=\"django.views.generic.edit.FormMixin.form_class\"><code class=\"xref py py-attr docutils literal notranslate\">form_class</code></a>, kommer ett <a class=\"reference internal\" href=\"/sv/6.0/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-exc docutils literal notranslate\">ImproperlyConfigured</code></a> undantag att uppstå.</p>\n<p>Slutligen kopplar vi in dessa nya vyer i URLconf:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">urls.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.views</span> <span class=\"kn\">import</span> AuthorCreateView<span class=\"p\">,</span> AuthorDeleteView<span class=\"p\">,</span> AuthorUpdateView\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"c1\"># ...</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;author/add/&quot;</span><span class=\"p\">,</span> AuthorCreateView<span class=\"o\">.</span>as_view<span class=\"p\">(),</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;author-add&quot;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;author/&lt;int:pk&gt;/&quot;</span><span class=\"p\">,</span> AuthorUpdateView<span class=\"o\">.</span>as_view<span class=\"p\">(),</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;author-update&quot;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;author/&lt;int:pk&gt;/delete/&quot;</span><span class=\"p\">,</span> AuthorDeleteView<span class=\"o\">.</span>as_view<span class=\"p\">(),</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;author-delete&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Dessa vyer ärver <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectTemplateResponseMixin\" title=\"django.views.generic.detail.SingleObjectTemplateResponseMixin\"><code class=\"xref py py-class docutils literal notranslate\">SingleObjectTemplateResponseMixin</code></a> som använder <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectTemplateResponseMixin.template_name_suffix\" title=\"django.views.generic.detail.SingleObjectTemplateResponseMixin.template_name_suffix\"><code class=\"xref py py-attr docutils literal notranslate\">template_name_suffix</code></a> för att konstruera <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.template_name\" title=\"django.views.generic.base.TemplateResponseMixin.template_name\"><code class=\"xref py py-attr docutils literal notranslate\">template_name</code></a> baserat på modellen.</p>\n<p>I detta exempel:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/flattened-index/#CreateView\" title=\"CreateView\"><code class=\"xref py py-class docutils literal notranslate\">CreateView</code></a> och <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/flattened-index/#UpdateView\" title=\"UpdateView\"><code class=\"xref py py-class docutils literal notranslate\">UpdateView</code></a> använder <code class=\"docutils literal notranslate\">myapp/author_form.html</code></p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/flattened-index/#DeleteView\" title=\"DeleteView\"><code class=\"xref py py-class docutils literal notranslate\">DeleteView</code></a> använder <code class=\"docutils literal notranslate\">myapp/author_confirm_delete.html</code></p></li>\n</ul>\n<p>Om du vill ha separata mallar för <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/flattened-index/#CreateView\" title=\"CreateView\"><code class=\"xref py py-class docutils literal notranslate\">CreateView</code></a> och <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/flattened-index/#UpdateView\" title=\"UpdateView\"><code class=\"xref py py-class docutils literal notranslate\">UpdateView</code></a> kan du ange antingen <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.template_name\" title=\"django.views.generic.base.TemplateResponseMixin.template_name\"><code class=\"xref py py-attr docutils literal notranslate\">template_name</code></a> eller <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectTemplateResponseMixin.template_name_suffix\" title=\"django.views.generic.detail.SingleObjectTemplateResponseMixin.template_name_suffix\"><code class=\"xref py py-attr docutils literal notranslate\">template_name_suffix</code></a> på din vyklass.</p>\n</aside>\n</section>\n<section id=\"models-and-request-user\">\n<h2>Modeller och <code class=\"docutils literal notranslate\">request.user</code><a class=\"heading-anchor\" href=\"#models-and-request-user\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>För att spåra den användare som skapade ett objekt med hjälp av en <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/flattened-index/#CreateView\" title=\"CreateView\"><code class=\"xref py py-class docutils literal notranslate\">CreateView</code></a> kan du använda en anpassad <a class=\"reference internal\" href=\"/sv/6.0/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a> för att göra detta. Lägg först till den främmande nyckelrelationen i modellen:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">modeller.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.models</span> <span class=\"kn\">import</span> User\n<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\">200</span><span class=\"p\">)</span>\n    created_by <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>User<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n\n    <span class=\"c1\"># ...</span>\n</code></pre></figure>\n<p>In the view, ensure that you don’t include <code class=\"docutils literal notranslate\">created_by</code> in the list of fields\nto edit, and override\n<a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin.form_valid\" title=\"django.views.generic.edit.ModelFormMixin.form_valid\"><code class=\"xref py py-meth docutils literal notranslate\">form_valid()</code></a> to add the user:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">Vyer.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.mixins</span> <span class=\"kn\">import</span> LoginRequiredMixin\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.edit</span> <span class=\"kn\">import</span> CreateView\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\">AuthorCreateView</span><span class=\"p\">(</span>LoginRequiredMixin<span class=\"p\">,</span> CreateView<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>\n\n    <span class=\"k\">def</span> <span class=\"nf\">form_valid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> form<span class=\"p\">):</span>\n        form<span class=\"o\">.</span>instance<span class=\"o\">.</span>created_by <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>request<span class=\"o\">.</span>user\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>form_valid<span class=\"p\">(</span>form<span class=\"p\">)</span>\n</code></pre></figure>\n<p><a class=\"reference internal\" href=\"/sv/6.0/topics/auth/default/#django.contrib.auth.mixins.LoginRequiredMixin\" title=\"django.contrib.auth.mixins.LoginRequiredMixin\"><code class=\"xref py py-class docutils literal notranslate\">LoginRequiredMixin</code></a> prevents users who\naren’t logged in from accessing the form. If you omit that, you’ll need to\nhandle unauthorized users in <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-editing/#django.views.generic.edit.ModelFormMixin.form_valid\" title=\"django.views.generic.edit.ModelFormMixin.form_valid\"><code class=\"xref py py-meth docutils literal notranslate\">form_valid()</code></a>.</p>\n</section>\n<section id=\"content-negotiation-example\">\n<span id=\"id1\"></span><h2>Exempel på förhandling om innehåll<a class=\"heading-anchor\" href=\"#content-negotiation-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Här är ett exempel som visar hur du kan gå tillväga för att implementera ett formulär som fungerar med ett API-baserat arbetsflöde såväl som ”vanliga” formulärposts:</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.http</span> <span class=\"kn\">import</span> JsonResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.edit</span> <span class=\"kn\">import</span> CreateView\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\">JsonableResponseMixin</span><span class=\"p\">:</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Mixin to add JSON support to a form.</span>\n<span class=\"sd\">    Must be used with an object-based FormView (e.g. CreateView)</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">form_invalid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> form<span class=\"p\">):</span>\n        response <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>form_invalid<span class=\"p\">(</span>form<span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span>request<span class=\"o\">.</span>accepts<span class=\"p\">(</span><span class=\"s2\">&quot;text/html&quot;</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> response\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> JsonResponse<span class=\"p\">(</span>form<span class=\"o\">.</span>errors<span class=\"p\">,</span> status<span class=\"o\">=</span><span class=\"mi\">400</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">form_valid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> form<span class=\"p\">):</span>\n        <span class=\"c1\"># We make sure to call the parent&#39;s form_valid() method because</span>\n        <span class=\"c1\"># it might do some processing (in the case of CreateView, it will</span>\n        <span class=\"c1\"># call form.save() for example).</span>\n        response <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>form_valid<span class=\"p\">(</span>form<span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span>request<span class=\"o\">.</span>accepts<span class=\"p\">(</span><span class=\"s2\">&quot;text/html&quot;</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> response\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            data <span class=\"o\">=</span> <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span>object<span class=\"o\">.</span>pk<span class=\"p\">,</span>\n            <span class=\"p\">}</span>\n            <span class=\"k\">return</span> JsonResponse<span class=\"p\">(</span>data<span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorCreateView</span><span class=\"p\">(</span>JsonableResponseMixin<span class=\"p\">,</span> CreateView<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>\n</code></pre></div>\n<p>I exemplet ovan antas att om klienten har stöd för <code class=\"docutils literal notranslate\">text/html</code>, så kommer de att föredra det. Detta kanske dock inte alltid är sant. Vid begäran om en <code class=\"docutils literal notranslate\">.css</code>-fil kommer många webbläsare att skicka rubriken <code class=\"docutils literal notranslate\">Accept: text/css,*/*;q=0.1</code>, vilket indikerar att de föredrar CSS, men allt annat går bra. Detta innebär att <code class=\"docutils literal notranslate\">request.accepts(&quot;text/html&quot;)</code> kommer att vara <code class=\"docutils literal notranslate\">True</code>.</p>\n<p>För att bestämma rätt format, med hänsyn till klientens preferenser, använd <a class=\"reference internal\" href=\"/sv/6.0/ref/request-response/#django.http.HttpRequest.get_preferred_type\" title=\"django.http.HttpRequest.get_preferred_type\"><code class=\"xref py py-func docutils literal notranslate\">django.http.HttpRequest.get_preferred_type()</code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">JsonableResponseMixin</span><span class=\"p\">:</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Mixin to add JSON support to a form.</span>\n<span class=\"sd\">    Must be used with an object-based FormView (e.g. CreateView).</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    accepted_media_types <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;text/html&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;application/json&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">dispatch</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<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=\"k\">if</span> request<span class=\"o\">.</span>get_preferred_type<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>accepted_media_types<span class=\"p\">)</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"c1\"># No format in common.</span>\n            <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>\n                status_code<span class=\"o\">=</span><span class=\"mi\">406</span><span class=\"p\">,</span> headers<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;Accept&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;,&quot;</span><span class=\"o\">.</span>join<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>accepted_media_types<span class=\"p\">)}</span>\n            <span class=\"p\">)</span>\n\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>dispatch<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">form_invalid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> form<span class=\"p\">):</span>\n        response <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>form_invalid<span class=\"p\">(</span>form<span class=\"p\">)</span>\n        accepted_type <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>request<span class=\"o\">.</span>get_preferred_type<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>accepted_media_types<span class=\"p\">)</span>\n        <span class=\"k\">if</span> accepted_type <span class=\"o\">==</span> <span class=\"s2\">&quot;text/html&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> response\n        <span class=\"k\">elif</span> accepted_type <span class=\"o\">==</span> <span class=\"s2\">&quot;application/json&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> JsonResponse<span class=\"p\">(</span>form<span class=\"o\">.</span>errors<span class=\"p\">,</span> status<span class=\"o\">=</span><span class=\"mi\">400</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">form_valid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> form<span class=\"p\">):</span>\n        <span class=\"c1\"># We make sure to call the parent&#39;s form_valid() method because</span>\n        <span class=\"c1\"># it might do some processing (in the case of CreateView, it will</span>\n        <span class=\"c1\"># call form.save() for example).</span>\n        response <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>form_valid<span class=\"p\">(</span>form<span class=\"p\">)</span>\n        accepted_type <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>request<span class=\"o\">.</span>get_preferred_type<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>accepted_media_types<span class=\"p\">)</span>\n        <span class=\"k\">if</span> accepted_type <span class=\"o\">==</span> <span class=\"s2\">&quot;text/html&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> response\n        <span class=\"k\">elif</span> accepted_type <span class=\"o\">==</span> <span class=\"s2\">&quot;application/json&quot;</span><span class=\"p\">:</span>\n            data <span class=\"o\">=</span> <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span>object<span class=\"o\">.</span>pk<span class=\"p\">,</span>\n            <span class=\"p\">}</span>\n            <span class=\"k\">return</span> JsonResponse<span class=\"p\">(</span>data<span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"5.2\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 5.2</p><p>Metoden <a class=\"reference internal\" href=\"/sv/6.0/ref/request-response/#django.http.HttpRequest.get_preferred_type\" title=\"django.http.HttpRequest.get_preferred_type\"><code class=\"xref py py-meth docutils literal notranslate\">HttpRequest.get_preferred_type()</code></a> lades till.</p>\n</aside>\n</section>","rootId":"form-handling-with-class-based-views","toc":[{"title":"Grundläggande former","anchor":"basic-forms","children":[]},{"title":"Modellformer","anchor":"model-forms","children":[]},{"title":"Modeller och request.user","anchor":"models-and-request-user","children":[]},{"title":"Exempel på förhandling om innehåll","anchor":"content-negotiation-example","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.0/topics/"},{"docname":"topics/class-based-views/index","title":"Klassbaserade åsikter","url":"/sv/6.0/topics/class-based-views/"}],"prev":{"docname":"topics/class-based-views/generic-display","title":"Inbyggda klassbaserade generiska vyer","url":"/sv/6.0/topics/class-based-views/generic-display/"},"next":{"docname":"topics/class-based-views/mixins","title":"Använda mixins med klassbaserade vyer","url":"/sv/6.0/topics/class-based-views/mixins/"},"formats":{"html":"/sv/6.0/topics/class-based-views/generic-editing/","markdown":"/sv/6.0/topics/class-based-views/generic-editing.md","json":"/sv/6.0/topics/class-based-views/generic-editing.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/class-based-views/generic-editing.txt","official":"https://docs.djangoproject.com/sv/6.0/topics/class-based-views/generic-editing/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}