{"title":"Använda mixins med klassbaserade vyer","version":"6.1","locale":"sv","docname":"topics/class-based-views/mixins","url":"/sv/6.1/topics/class-based-views/mixins/","canonical":"https://djangodocs.dev/sv/6.1/topics/class-based-views/mixins/","summary":"Djangos inbyggda klassbaserade vyer ger en hel del funktionalitet, men en del av den kanske du vill använda separat.","html":"<h1>Använda mixins med klassbaserade vyer<a class=\"heading-anchor\" href=\"#using-mixins-with-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"admonition admonition-caution\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Detta är ett avancerat ämne. Du bör ha praktiska kunskaper om <a class=\"reference internal\" href=\"/sv/6.1/topics/class-based-views/\"><span class=\"doc\">Djangos klassbaserade vyer</span></a> innan du utforskar dessa tekniker.</p>\n</aside>\n<p>Djangos inbyggda klassbaserade vyer ger en hel del funktionalitet, men en del av den kanske du vill använda separat. Till exempel kanske du vill skriva en vy som renderar en mall för att skapa HTTP-svaret, men du kan inte använda <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/base/#django.views.generic.base.TemplateView\" title=\"django.views.generic.base.TemplateView\"><code class=\"xref py py-class docutils literal notranslate\">TemplateView</code></a>; kanske behöver du bara rendera en mall på <code class=\"docutils literal notranslate\">POST</code>, med <code class=\"docutils literal notranslate\">GET</code> som gör något helt annat. Även om du kan använda <a class=\"reference internal\" href=\"/sv/6.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\">TemplateResponse</code></a> direkt, kommer detta sannolikt att resultera i duplicerad kod.</p>\n<p>Av denna anledning tillhandahåller Django också ett antal mixins som ger mer diskret funktionalitet. Mallrendering, till exempel, är inkapslad i <a class=\"reference internal\" href=\"/sv/6.1/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>. Djangos referensdokumentation innehåller <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins/\"><span class=\"doc\">full dokumentation av alla mixins</span></a>.</p>\n<section id=\"context-and-template-responses\">\n<h2>Sammanhang och svarsmallar<a class=\"heading-anchor\" href=\"#context-and-template-responses\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Två centrala mixins tillhandahålls som hjälper till att tillhandahålla ett konsekvent gränssnitt för att arbeta med mallar i klassbaserade vyer.</p>\n<dl>\n<dt><a class=\"reference internal\" href=\"/sv/6.1/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></dt><dd><p>Varje inbyggd vy som returnerar en <a class=\"reference internal\" href=\"/sv/6.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\">TemplateResponse</code></a> anropar metoden <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.render_to_response\" title=\"django.views.generic.base.TemplateResponseMixin.render_to_response\"><code class=\"xref py py-meth docutils literal notranslate\">render_to_response()</code></a> som <code class=\"docutils literal notranslate\">TemplateResponseMixin</code> tillhandahåller. För det mesta anropas den åt dig (den anropas till exempel av metoden <code class=\"docutils literal notranslate\">get()</code> som implementeras av både <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/base/#django.views.generic.base.TemplateView\" title=\"django.views.generic.base.TemplateView\"><code class=\"xref py py-class docutils literal notranslate\">TemplateView</code></a> och <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.detail.DetailView\" title=\"django.views.generic.detail.DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a>); på samma sätt är det osannolikt att du behöver åsidosätta den. Om du däremot vill att ditt svar ska returnera något som inte renderas via en Django-mall behöver du göra det. Se <a class=\"reference internal\" href=\"#jsonresponsemixin-example\"><span class=\"std std-ref\">exemplet med JSONResponseMixin</span></a> för ett exempel.</p>\n<p><code class=\"docutils literal notranslate\">render_to_response()</code> själv anropar <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.get_template_names\" title=\"django.views.generic.base.TemplateResponseMixin.get_template_names\"><code class=\"xref py py-meth docutils literal notranslate\">get_template_names()</code></a>, som standard kommer att leta upp <a class=\"reference internal\" href=\"/sv/6.1/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> på den klassbaserade vyn; två andra mixins (<a class=\"reference internal\" href=\"/sv/6.1/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> och <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectTemplateResponseMixin\" title=\"django.views.generic.list.MultipleObjectTemplateResponseMixin\"><code class=\"xref py py-class docutils literal notranslate\">MultipleObjectTemplateResponseMixin</code></a>) åsidosätter detta för att ge mer flexibla standardvärden när man hanterar faktiska objekt.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin\" title=\"django.views.generic.base.ContextMixin\"><code class=\"xref py py-class docutils literal notranslate\">ContextMixin</code></a></dt><dd><p>Varje inbyggd vy som behöver kontextdata, till exempel för att rendera en mall (inklusive <code class=\"docutils literal notranslate\">TemplateResponseMixin</code> ovan), bör anropa <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin.get_context_data\" title=\"django.views.generic.base.ContextMixin.get_context_data\"><code class=\"xref py py-meth docutils literal notranslate\">get_context_data()</code></a> och skicka med de data den vill säkerställa finns där som nyckelordsargument. <code class=\"docutils literal notranslate\">get_context_data()</code> returnerar en ordbok; i <code class=\"docutils literal notranslate\">ContextMixin</code> returnerar den sina nyckelordsargument, men det är vanligt att åsidosätta detta för att lägga till fler poster i ordboken. Du kan också använda attributet <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin.extra_context\" title=\"django.views.generic.base.ContextMixin.extra_context\"><code class=\"xref py py-attr docutils literal notranslate\">extra_context</code></a>.</p>\n</dd>\n</dl>\n</section>\n<section id=\"building-up-django-s-generic-class-based-views\">\n<h2>Uppbyggnad av Djangos generiska klassbaserade vyer<a class=\"heading-anchor\" href=\"#building-up-django-s-generic-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Låt oss titta på hur två av Djangos generiska klassbaserade vyer är uppbyggda av mixins som ger diskret funktionalitet. Vi kommer att överväga <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.detail.DetailView\" title=\"django.views.generic.detail.DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a>, som renderar en ”detaljerad” vy av ett objekt, och <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.list.ListView\" title=\"django.views.generic.list.ListView\"><code class=\"xref py py-class docutils literal notranslate\">ListView</code></a>, som kommer att rendera en lista över objekt, vanligtvis från en queryset, och eventuellt paginera dem. Detta kommer att introducera oss till fyra mixins som tillsammans ger användbar funktionalitet när man arbetar med antingen ett enda Django-objekt eller flera objekt.</p>\n<p>Det finns också mixins involverade i de generiska redigeringsvyerna (<a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView\" title=\"django.views.generic.edit.FormView\"><code class=\"xref py py-class docutils literal notranslate\">FormView</code></a>, och de modellspecifika vyerna <a class=\"reference internal\" href=\"/sv/6.1/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>, <a class=\"reference internal\" href=\"/sv/6.1/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> och <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-editing/#django.views.generic.edit.DeleteView\" title=\"django.views.generic.edit.DeleteView\"><code class=\"xref py py-class docutils literal notranslate\">DeleteView</code></a>), och i de datumbaserade generiska vyerna. Dessa behandlas i <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins/\"><span class=\"doc\">mixin referensdokumentation</span></a>.</p>\n<section id=\"detailview-working-with-a-single-django-object\">\n<h3><code class=\"docutils literal notranslate\">DetailView</code>: att arbeta med ett enda Django-objekt<a class=\"heading-anchor\" href=\"#detailview-working-with-a-single-django-object\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>För att visa detaljerna i ett objekt måste vi i princip göra två saker: vi måste leta upp objektet och sedan måste vi skapa en <a class=\"reference internal\" href=\"/sv/6.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\">TemplateResponse</code></a> med en lämplig mall och det objektet som kontext.</p>\n<p>För att hämta objektet förlitar sig <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.detail.DetailView\" title=\"django.views.generic.detail.DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a> på <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin\" title=\"django.views.generic.detail.SingleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">SingleObjectMixin</code></a>, som tillhandahåller metoden <a class=\"reference internal\" href=\"/sv/6.1/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> som avgör objektet utifrån begärans URL (den letar efter nyckelordsargumenten <code class=\"docutils literal notranslate\">pk</code> och <code class=\"docutils literal notranslate\">slug</code> enligt deklarationen i URL-konfigurationen och slår upp objektet antingen från attributet <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.model\" title=\"django.views.generic.detail.SingleObjectMixin.model\"><code class=\"xref py py-attr docutils literal notranslate\">model</code></a> på vyn eller från attributet <a class=\"reference internal\" href=\"/sv/6.1/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> om det anges). <code class=\"docutils literal notranslate\">SingleObjectMixin</code> åsidosätter också <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin.get_context_data\" title=\"django.views.generic.base.ContextMixin.get_context_data\"><code class=\"xref py py-meth docutils literal notranslate\">get_context_data()</code></a>, som används i alla Djangos inbyggda klassbaserade vyer för att tillhandahålla kontextdata vid mallrendering.</p>\n<p>För att sedan skapa en <a class=\"reference internal\" href=\"/sv/6.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\">TemplateResponse</code></a> använder <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#DetailView\" title=\"DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a> <a class=\"reference internal\" href=\"/sv/6.1/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 utökar <a class=\"reference internal\" href=\"/sv/6.1/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> och åsidosätter <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.get_template_names\" title=\"django.views.generic.base.TemplateResponseMixin.get_template_names\"><code class=\"xref py py-meth docutils literal notranslate\">get_template_names()</code></a> enligt beskrivningen ovan. Den tillhandahåller faktiskt en ganska sofistikerad uppsättning alternativ, men det huvudsakliga alternativet som de flesta använder är <code class=\"docutils literal notranslate\">&lt;app_label&gt;/&lt;model_name&gt;_detail.html</code>. Delen <code class=\"docutils literal notranslate\">_detail</code> kan ändras genom att sätta <a class=\"reference internal\" href=\"/sv/6.1/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> till något annat i en underklass. (Till exempel använder de <a class=\"reference internal\" href=\"/sv/6.1/topics/class-based-views/generic-editing/\"><span class=\"doc\">generiska redigeringsvyerna</span></a> <code class=\"docutils literal notranslate\">_form</code> för skapa- och uppdateringsvyer och <code class=\"docutils literal notranslate\">_confirm_delete</code> för borttagningsvyer.)</p>\n</section>\n<section id=\"listview-working-with-many-django-objects\">\n<h3><code class=\"docutils literal notranslate\">ListView</code>: arbeta med många Django-objekt<a class=\"heading-anchor\" href=\"#listview-working-with-many-django-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Listor med objekt följer ungefär samma mönster: vi behöver en (eventuellt paginerad) lista med objekt, vanligtvis en <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>, och sedan måste vi skapa en <a class=\"reference internal\" href=\"/sv/6.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\">TemplateResponse</code></a> med en lämplig mall som använder den listan med objekt.</p>\n<p>För att få objekten använder <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.list.ListView\" title=\"django.views.generic.list.ListView\"><code class=\"xref py py-class docutils literal notranslate\">ListView</code></a> <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin\" title=\"django.views.generic.list.MultipleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">MultipleObjectMixin</code></a>, som tillhandahåller både <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.get_queryset\" title=\"django.views.generic.list.MultipleObjectMixin.get_queryset\"><code class=\"xref py py-meth docutils literal notranslate\">get_queryset()</code></a> och <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.paginate_queryset\" title=\"django.views.generic.list.MultipleObjectMixin.paginate_queryset\"><code class=\"xref py py-meth docutils literal notranslate\">paginate_queryset()</code></a>. Till skillnad från <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin\" title=\"django.views.generic.detail.SingleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">SingleObjectMixin</code></a> finns det inget behov av att ange delar av URL:en för att räkna ut vilken queryset som ska användas, så standardvärdet använder attributet <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.queryset\" title=\"django.views.generic.list.MultipleObjectMixin.queryset\"><code class=\"xref py py-attr docutils literal notranslate\">queryset</code></a> eller <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.model\" title=\"django.views.generic.list.MultipleObjectMixin.model\"><code class=\"xref py py-attr docutils literal notranslate\">model</code></a> på vyklassen. En vanlig anledning att åsidosätta <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin.get_queryset\" title=\"django.views.generic.list.MultipleObjectMixin.get_queryset\"><code class=\"xref py py-meth docutils literal notranslate\">get_queryset()</code></a> här skulle vara att dynamiskt variera objekten, till exempel beroende på den aktuella användaren eller att utesluta inlägg i framtiden för en blogg.</p>\n<p><a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin\" title=\"django.views.generic.list.MultipleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">MultipleObjectMixin</code></a> åsidosätter också <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin.get_context_data\" title=\"django.views.generic.base.ContextMixin.get_context_data\"><code class=\"xref py py-meth docutils literal notranslate\">get_context_data()</code></a> för att inkludera lämpliga kontextvariabler för paginering (och tillhandahåller platshållare om paginering är inaktiverad). Den förlitar sig på att <code class=\"docutils literal notranslate\">object_list</code> skickas med som ett nyckelordsargument, vilket <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#ListView\" title=\"ListView\"><code class=\"xref py py-class docutils literal notranslate\">ListView</code></a> ordnar.</p>\n<p>För att skapa en <a class=\"reference internal\" href=\"/sv/6.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\">TemplateResponse</code></a> använder <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#ListView\" title=\"ListView\"><code class=\"xref py py-class docutils literal notranslate\">ListView</code></a> sedan <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectTemplateResponseMixin\" title=\"django.views.generic.list.MultipleObjectTemplateResponseMixin\"><code class=\"xref py py-class docutils literal notranslate\">MultipleObjectTemplateResponseMixin</code></a>. Precis som <a class=\"reference internal\" href=\"/sv/6.1/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> ovan åsidosätter denna <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectTemplateResponseMixin.get_template_names\" title=\"django.views.generic.list.MultipleObjectTemplateResponseMixin.get_template_names\"><code class=\"xref py py-meth docutils literal notranslate\">get_template_names()</code></a> för att tillhandahålla en rad alternativ. Det vanligaste är <code class=\"docutils literal notranslate\">&lt;app_label&gt;/&lt;model_name&gt;_list.html</code>, där delen <code class=\"docutils literal notranslate\">_list</code> återigen hämtas från attributet <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectTemplateResponseMixin.template_name_suffix\" title=\"django.views.generic.list.MultipleObjectTemplateResponseMixin.template_name_suffix\"><code class=\"xref py py-attr docutils literal notranslate\">template_name_suffix</code></a>. (De datumbaserade generiska vyerna använder suffix som <code class=\"docutils literal notranslate\">_archive</code>, <code class=\"docutils literal notranslate\">_archive_year</code> och så vidare för att använda olika mallar för de olika specialiserade datumbaserade listvyerna.)</p>\n</section>\n</section>\n<section id=\"using-django-s-class-based-view-mixins\">\n<h2>Använda Djangos klassbaserade vy-mixins<a class=\"heading-anchor\" href=\"#using-django-s-class-based-view-mixins\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Nu har vi sett hur Djangos generiska klassbaserade vyer använder de medföljande mixinerna, låt oss titta på andra sätt vi kan kombinera dem. Vi kommer fortfarande att kombinera dem med antingen inbyggda klassbaserade vyer eller andra generiska klassbaserade vyer, men det finns en rad sällsynta problem du kan lösa än vad som tillhandahålls av Django från början.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Alla mixins kan inte användas tillsammans, och alla generiska klassbaserade vyer kan inte användas med alla andra mixins. Här presenterar vi några exempel som fungerar; om du vill sammanföra annan funktionalitet måste du ta hänsyn till interaktioner mellan attribut och metoder som överlappar mellan de olika klasserna du använder, och hur <a class=\"reference external\" href=\"https://www.python.org/download/releases/2.3/mro/\">method resolution order</a> påverkar vilka versioner av metoderna som ska anropas i vilken ordning.</p>\n<p>Referensdokumentationen för Djangos <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/\"><span class=\"doc\">class-based views</span></a> och <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins/\"><span class=\"doc\">class-based view mixins</span></a> hjälper dig att förstå vilka attribut och metoder som sannolikt kommer att orsaka konflikt mellan olika klasser och mixins.</p>\n<p>Om du är osäker är det ofta bättre att backa och basera ditt arbete på <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#View\" title=\"View\"><code class=\"xref py py-class docutils literal notranslate\">View</code></a> eller <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#TemplateView\" title=\"TemplateView\"><code class=\"xref py py-class docutils literal notranslate\">TemplateView</code></a>, kanske med <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin\" title=\"django.views.generic.detail.SingleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">SingleObjectMixin</code></a> och <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin\" title=\"django.views.generic.list.MultipleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">MultipleObjectMixin</code></a>. Även om du förmodligen kommer att skriva mer kod, är det mer sannolikt att den är tydligt förståelig för någon annan som kommer till den senare, och med färre interaktioner att oroa sig för sparar du dig själv en del tänkande. (Naturligtvis kan du alltid dyka in i Djangos implementering av de generiska klassbaserade vyerna för inspiration om hur du ska ta itu med problem)</p>\n</aside>\n<section id=\"using-singleobjectmixin-with-view\">\n<h3>Använda <code class=\"docutils literal notranslate\">SingleObjectMixin</code> med View<a class=\"heading-anchor\" href=\"#using-singleobjectmixin-with-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om vi vill skriva en klassbaserad vy som bara svarar på <code class=\"docutils literal notranslate\">POST</code>, subklassar vi <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/base/#django.views.generic.base.View\" title=\"django.views.generic.base.View\"><code class=\"xref py py-class docutils literal notranslate\">View</code></a> och skriver en <code class=\"docutils literal notranslate\">post()</code>-metod i subklassen. Men om vi vill att vår bearbetning ska fungera på ett visst objekt, identifierat från URL, vill vi ha den funktionalitet som tillhandahålls av <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin\" title=\"django.views.generic.detail.SingleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">SingleObjectMixin</code></a>.</p>\n<p>Vi visar detta med modellen <code class=\"docutils literal notranslate\">Author</code> som vi använde i <a class=\"reference internal\" href=\"/sv/6.1/topics/class-based-views/generic-display/\"><span class=\"doc\">introduktionen till generiska klassbaserade vyer</span></a>.</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.http</span> <span class=\"kn\">import</span> HttpResponseForbidden<span class=\"p\">,</span> HttpResponseRedirect\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> reverse\n<span class=\"kn\">from</span> <span class=\"nn\">django.views</span> <span class=\"kn\">import</span> View\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.detail</span> <span class=\"kn\">import</span> SingleObjectMixin\n<span class=\"kn\">from</span> <span class=\"nn\">books.models</span> <span class=\"kn\">import</span> Author\n\n\n<span class=\"k\">class</span> <span class=\"nc\">RecordInterestView</span><span class=\"p\">(</span>SingleObjectMixin<span class=\"p\">,</span> View<span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Records the current user&#39;s interest in an author.&quot;&quot;&quot;</span>\n\n    model <span class=\"o\">=</span> Author\n\n    <span class=\"k\">def</span> <span class=\"nf\">post</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> <span class=\"ow\">not</span> request<span class=\"o\">.</span>user<span class=\"o\">.</span>is_authenticated<span class=\"p\">:</span>\n            <span class=\"k\">return</span> HttpResponseForbidden<span class=\"p\">()</span>\n\n        <span class=\"c1\"># Look up the author we&#39;re interested in.</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>object <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_object<span class=\"p\">()</span>\n        <span class=\"c1\"># Actually record interest somehow here!</span>\n\n        <span class=\"k\">return</span> HttpResponseRedirect<span class=\"p\">(</span>\n            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>object<span class=\"o\">.</span>pk<span class=\"p\">})</span>\n        <span class=\"p\">)</span>\n</code></pre></figure>\n<p>I praktiken skulle du förmodligen vilja registrera intresset i en nyckelvärdesbutik snarare än i en relationsdatabas, så vi har utelämnat den biten. Den enda delen av vyn som behöver oroa sig för att använda <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin\" title=\"django.views.generic.detail.SingleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">SingleObjectMixin</code></a> är där vi vill leta upp den författare vi är intresserade av, vilket den gör med ett anrop till <code class=\"docutils literal notranslate\">self.get_object()</code>. Allt annat tas om hand för oss av mixin.</p>\n<p>Vi kan enkelt koppla in detta i våra webbadresser:</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\">books.views</span> <span class=\"kn\">import</span> RecordInterestView\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"c1\"># ...</span>\n    path<span class=\"p\">(</span>\n        <span class=\"s2\">&quot;author/&lt;int:pk&gt;/interest/&quot;</span><span class=\"p\">,</span>\n        RecordInterestView<span class=\"o\">.</span>as_view<span class=\"p\">(),</span>\n        name<span class=\"o\">=</span><span class=\"s2\">&quot;author-interest&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Notera gruppen med namnet <code class=\"docutils literal notranslate\">pk</code>, som <a class=\"reference internal\" href=\"/sv/6.1/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> använder för att leta upp instansen <code class=\"docutils literal notranslate\">Author</code>. Du kan också använda en slug, eller någon av de andra funktionerna i <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin\" title=\"django.views.generic.detail.SingleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">SingleObjectMixin</code></a>.</p>\n</section>\n<section id=\"using-singleobjectmixin-with-listview\">\n<h3>Använda <code class=\"docutils literal notranslate\">SingleObjectMixin</code> med <code class=\"docutils literal notranslate\">ListView</code><a class=\"heading-anchor\" href=\"#using-singleobjectmixin-with-listview\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.list.ListView\" title=\"django.views.generic.list.ListView\"><code class=\"xref py py-class docutils literal notranslate\">ListView</code></a> ger inbyggd paginering, men du kanske vill paginera en lista med objekt som alla är länkade (med en främmande nyckel) till ett annat objekt. I vårt publiceringsexempel kanske du vill paginera genom alla böcker från en viss utgivare.</p>\n<p>Ett sätt att göra detta är att kombinera <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#ListView\" title=\"ListView\"><code class=\"xref py py-class docutils literal notranslate\">ListView</code></a> med <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin\" title=\"django.views.generic.detail.SingleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">SingleObjectMixin</code></a>, så att queryset för den paginerade listan med böcker kan hänga på förlaget som hittas som ett enda objekt. För att kunna göra detta måste vi ha två olika querysets:</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">Book</code> queryset för användning av <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.list.ListView\" title=\"django.views.generic.list.ListView\"><code class=\"xref py py-class docutils literal notranslate\">ListView</code></a></dt><dd><p>Eftersom vi har tillgång till det förlag vars böcker vi vill lista, åsidosätter vi <code class=\"docutils literal notranslate\">get_queryset()</code> och använder förlagets <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/#backwards-related-objects\"><span class=\"std std-ref\">reverse foreign key manager</span></a>.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">Publisher</code>-queryset som används i <a class=\"reference internal\" href=\"/sv/6.1/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></dt><dd><p>Vi kommer att förlita oss på standardimplementeringen av <code class=\"docutils literal notranslate\">get_object()</code> för att hämta rätt <code class=\"docutils literal notranslate\">Publisher</code>-objekt. Vi måste dock uttryckligen skicka ett <code class=\"docutils literal notranslate\">queryset</code>-argument eftersom standardimplementeringen av <code class=\"docutils literal notranslate\">get_object()</code> annars skulle anropa <code class=\"docutils literal notranslate\">get_queryset()</code> som vi har åsidosatt för att returnera <code class=\"docutils literal notranslate\">Book</code>-objekt istället för <code class=\"docutils literal notranslate\">Publisher</code>-objekt.</p>\n</dd>\n</dl>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Vi måste tänka noga på <code class=\"docutils literal notranslate\">get_context_data()</code>. Eftersom både <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin\" title=\"django.views.generic.detail.SingleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">SingleObjectMixin</code></a> och <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#ListView\" title=\"ListView\"><code class=\"xref py py-class docutils literal notranslate\">ListView</code></a> kommer att lägga saker i kontextdata under värdet av <code class=\"docutils literal notranslate\">context_object_name</code> om det är inställt, kommer vi istället att uttryckligen se till att <code class=\"docutils literal notranslate\">Publisher</code> finns i kontextdata. <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#ListView\" title=\"ListView\"><code class=\"xref py py-class docutils literal notranslate\">ListView</code></a> kommer att lägga till lämplig <code class=\"docutils literal notranslate\">page_obj</code> och <code class=\"docutils literal notranslate\">paginator</code> åt oss förutsatt att vi kommer ihåg att anropa <code class=\"docutils literal notranslate\">super()</code>.</p>\n</aside>\n<p>Nu kan vi skriva en ny <code class=\"docutils literal notranslate\">PublisherDetailView</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.views.generic</span> <span class=\"kn\">import</span> ListView\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.detail</span> <span class=\"kn\">import</span> SingleObjectMixin\n<span class=\"kn\">from</span> <span class=\"nn\">books.models</span> <span class=\"kn\">import</span> Publisher\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PublisherDetailView</span><span class=\"p\">(</span>SingleObjectMixin<span class=\"p\">,</span> ListView<span class=\"p\">):</span>\n    paginate_by <span class=\"o\">=</span> <span class=\"mi\">2</span>\n    template_name <span class=\"o\">=</span> <span class=\"s2\">&quot;books/publisher_detail.html&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get</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=\"bp\">self</span><span class=\"o\">.</span>object <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_object<span class=\"p\">(</span>queryset<span class=\"o\">=</span>Publisher<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">())</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get<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\">get_context_data</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        context <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_context_data<span class=\"p\">(</span><span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n        context<span class=\"p\">[</span><span class=\"s2\">&quot;publisher&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>object\n        <span class=\"k\">return</span> context\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_queryset</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>object<span class=\"o\">.</span>book_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n</code></pre></div>\n<p>Lägg märke till hur vi anger <code class=\"docutils literal notranslate\">self.object</code> inom <code class=\"docutils literal notranslate\">get()</code> så att vi kan använda det igen senare i <code class=\"docutils literal notranslate\">get_context_data()</code> och <code class=\"docutils literal notranslate\">get_queryset()</code>. Om du inte anger <code class=\"docutils literal notranslate\">template_name</code>, kommer mallen som standard att välja det normala <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#ListView\" title=\"ListView\"><code class=\"xref py py-class docutils literal notranslate\">ListView</code></a>-valet, som i det här fallet skulle vara <code class=\"docutils literal notranslate\">&quot;books/book_list.html&quot;</code> eftersom det är en lista över böcker; <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#ListView\" title=\"ListView\"><code class=\"xref py py-class docutils literal notranslate\">ListView</code></a> vet ingenting om <code class=\"xref py py-class docutils literal notranslate\">SingleObjectMixin`</code>, så den har ingen aning om att den här vyn har något att göra med en <code class=\"docutils literal notranslate\">Publisher</code>.</p>\n<p><code class=\"docutils literal notranslate\">paginate_by</code> är avsiktligt liten i exemplet så att du inte behöver skapa massor av böcker för att se att pagineringen fungerar! Här är den mall du vill använda:</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=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>Publisher <span class=\"cp\">{{</span> <span class=\"nv\">publisher.name</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>\n\n    <span class=\"p\">&lt;</span><span class=\"nt\">ol</span><span class=\"p\">&gt;</span>\n      <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">book</span> <span class=\"k\">in</span> <span class=\"nv\">page_obj</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">book.title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">li</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\">ol</span><span class=\"p\">&gt;</span>\n\n    <span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;pagination&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;step-links&quot;</span><span class=\"p\">&gt;</span>\n            <span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">page_obj.has_previous</span> <span class=\"cp\">%}</span>\n                <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;?page=</span><span class=\"cp\">{{</span> <span class=\"nv\">page_obj.previous_page_number</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>previous<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n            <span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n\n            <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;current&quot;</span><span class=\"p\">&gt;</span>\n                Page <span class=\"cp\">{{</span> <span class=\"nv\">page_obj.number</span> <span class=\"cp\">}}</span> of <span class=\"cp\">{{</span> <span class=\"nv\">paginator.num_pages</span> <span class=\"cp\">}}</span>.\n            <span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n\n            <span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">page_obj.has_next</span> <span class=\"cp\">%}</span>\n                <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;?page=</span><span class=\"cp\">{{</span> <span class=\"nv\">page_obj.next_page_number</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>next<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n            <span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"avoid-anything-more-complex\">\n<h2>Undvik allt som är mer komplicerat<a class=\"heading-anchor\" href=\"#avoid-anything-more-complex\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Generellt kan du använda <a class=\"reference internal\" href=\"/sv/6.1/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> och <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin\" title=\"django.views.generic.detail.SingleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">SingleObjectMixin</code></a> när du behöver deras funktionalitet. Som visas ovan kan du med lite försiktighet till och med kombinera <code class=\"docutils literal notranslate\">SingleObjectMixin</code> med <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.list.ListView\" title=\"django.views.generic.list.ListView\"><code class=\"xref py py-class docutils literal notranslate\">ListView</code></a>. Saker och ting blir dock alltmer komplexa när du försöker göra det, och en bra tumregel är:</p>\n<aside class=\"admonition admonition-hint\" role=\"note\">\n<p class=\"admonition-title\">Råd</p>\n<p>Var och en av dina vyer bör endast använda mixiner eller vyer från en av grupperna med generiska klassbaserade vyer: <a class=\"reference internal\" href=\"/sv/6.1/topics/class-based-views/generic-display/\"><span class=\"doc\">detalj och lista</span></a>, <a class=\"reference internal\" href=\"/sv/6.1/topics/class-based-views/generic-editing/\"><span class=\"doc\">redigering</span></a> och datum. Det går till exempel bra att kombinera <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#TemplateView\" title=\"TemplateView\"><code class=\"xref py py-class docutils literal notranslate\">TemplateView</code></a> (inbyggd vy) med <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin\" title=\"django.views.generic.list.MultipleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">MultipleObjectMixin</code></a> (generisk lista), men du kommer sannolikt att få problem om du kombinerar <code class=\"docutils literal notranslate\">SingleObjectMixin</code> (generisk detaljvy) med <code class=\"docutils literal notranslate\">MultipleObjectMixin</code> (generisk listvy).</p>\n</aside>\n<p>För att visa vad som händer när man försöker bli mer sofistikerad, visar vi ett exempel som offrar läsbarhet och underhåll när det finns en enklare lösning. Låt oss först titta på ett naivt försök att kombinera <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.detail.DetailView\" title=\"django.views.generic.detail.DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a> med <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin\" title=\"django.views.generic.edit.FormMixin\"><code class=\"xref py py-class docutils literal notranslate\">FormMixin</code></a> för att göra det möjligt för oss att <code class=\"docutils literal notranslate\">POST</code> en Django <a class=\"reference internal\" href=\"/sv/6.1/ref/forms/api/#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> till samma URL som vi visar ett objekt med <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#DetailView\" title=\"DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a>.</p>\n<section id=\"using-formmixin-with-detailview\">\n<h3>Använda <code class=\"docutils literal notranslate\">FormMixin</code> med <code class=\"docutils literal notranslate\">DetailView</code><a class=\"heading-anchor\" href=\"#using-formmixin-with-detailview\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Tänk tillbaka på vårt tidigare exempel där vi använde <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#View\" title=\"View\"><code class=\"xref py py-class docutils literal notranslate\">View</code></a> och <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin\" title=\"django.views.generic.detail.SingleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">SingleObjectMixin</code></a> tillsammans. Vi registrerade en användares intresse för en viss författare; säg nu att vi vill låta dem lämna ett meddelande där de säger varför de gillar dem. Återigen, låt oss anta att vi inte kommer att lagra detta i en relationsdatabas utan istället i något mer esoteriskt som vi inte kommer att oroa oss för här.</p>\n<p>Vid denna tidpunkt är det naturligt att nå en <a class=\"reference internal\" href=\"/sv/6.1/ref/forms/api/#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> för att kapsla in den information som skickas från användarens webbläsare till Django. Säg också att vi är starkt investerade i <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Representational_state_transfer\">REST</a>, så vi vill använda samma URL för att visa författaren som för att fånga meddelandet från användaren. Låt oss skriva om vår <code class=\"docutils literal notranslate\">AuthorDetailView</code> för att göra det.</p>\n<p>Vi behåller <code class=\"docutils literal notranslate\">GET</code>-hanteringen från <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#DetailView\" title=\"DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a>, även om vi måste lägga till en <a class=\"reference internal\" href=\"/sv/6.1/ref/forms/api/#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> i kontextdata så att vi kan rendera den i mallen. Vi kommer också att vilja dra in formulärbehandling från <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin\" title=\"django.views.generic.edit.FormMixin\"><code class=\"xref py py-class docutils literal notranslate\">FormMixin</code></a>, och skriva lite kod så att formuläret på <code class=\"docutils literal notranslate\">POST</code> anropas på lämpligt sätt.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Vi använder <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin\" title=\"django.views.generic.edit.FormMixin\"><code class=\"xref py py-class docutils literal notranslate\">FormMixin</code></a> och implementerar <code class=\"docutils literal notranslate\">post()</code> själva istället för att försöka blanda <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#DetailView\" title=\"DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a> med <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#FormView\" title=\"FormView\"><code class=\"xref py py-class docutils literal notranslate\">FormView</code></a> (som redan tillhandahåller en lämplig <code class=\"docutils literal notranslate\">post()</code>) eftersom båda vyerna implementerar <code class=\"docutils literal notranslate\">get()</code>, och saker och ting skulle bli mycket mer förvirrande.</p>\n</aside>\n<p>Vår nya <code class=\"docutils literal notranslate\">AuthorDetailView</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=\"c1\"># CAUTION: you almost certainly do not want to do this.</span>\n<span class=\"c1\"># It is provided as part of a discussion of problems you can</span>\n<span class=\"c1\"># run into when combining different generic class-based view</span>\n<span class=\"c1\"># functionality that is not designed to be used together.</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponseForbidden\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> reverse\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic</span> <span class=\"kn\">import</span> DetailView\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.edit</span> <span class=\"kn\">import</span> FormMixin\n<span class=\"kn\">from</span> <span class=\"nn\">books.models</span> <span class=\"kn\">import</span> Author\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorInterestForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    message <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorDetailView</span><span class=\"p\">(</span>FormMixin<span class=\"p\">,</span> DetailView<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Author\n    form_class <span class=\"o\">=</span> AuthorInterestForm\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_success_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>object<span class=\"o\">.</span>pk<span class=\"p\">})</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">post</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> <span class=\"ow\">not</span> request<span class=\"o\">.</span>user<span class=\"o\">.</span>is_authenticated<span class=\"p\">:</span>\n            <span class=\"k\">return</span> HttpResponseForbidden<span class=\"p\">()</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>object <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_object<span class=\"p\">()</span>\n        form <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_form<span class=\"p\">()</span>\n        <span class=\"k\">if</span> form<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>form_valid<span class=\"p\">(</span>form<span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>form_invalid<span class=\"p\">(</span>form<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\"># Here, we would record the user&#39;s interest using the message</span>\n        <span class=\"c1\"># passed in form.cleaned_data[&#39;message&#39;]</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></div>\n<p><code class=\"docutils literal notranslate\">get_success_url()</code> ger någonstans att omdirigera till, som används i standardimplementeringen av <code class=\"docutils literal notranslate\">form_valid()</code>. Vi måste tillhandahålla vår egen <code class=\"docutils literal notranslate\">post()</code> som tidigare nämnts.</p>\n</section>\n<section id=\"a-better-solution\">\n<h3>En bättre lösning<a class=\"heading-anchor\" href=\"#a-better-solution\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Antalet subtila interaktioner mellan <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin\" title=\"django.views.generic.edit.FormMixin\"><code class=\"xref py py-class docutils literal notranslate\">FormMixin</code></a> och <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#DetailView\" title=\"DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a> testar redan vår förmåga att hantera saker. Det är osannolikt att du skulle vilja skriva den här typen av klass själv.</p>\n<p>I det här fallet kan du skriva <code class=\"docutils literal notranslate\">post()</code>-metoden själv och behålla <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#DetailView\" title=\"DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a> som den enda generiska funktionaliteten, även om det innebär mycket dubbelarbete att skriva <a class=\"reference internal\" href=\"/sv/6.1/ref/forms/api/#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a>-hanteringskod.</p>\n<p>Alternativt skulle det fortfarande vara mindre arbete än ovanstående tillvägagångssätt att ha en separat vy för bearbetning av formuläret, som kan använda <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView\" title=\"django.views.generic.edit.FormView\"><code class=\"xref py py-class docutils literal notranslate\">FormView</code></a> skilt från <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#DetailView\" title=\"DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a> utan problem.</p>\n</section>\n<section id=\"an-alternative-better-solution\">\n<h3>En alternativ bättre lösning<a class=\"heading-anchor\" href=\"#an-alternative-better-solution\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Vad vi egentligen försöker göra här är att använda två olika klassbaserade vyer från samma URL. Så varför inte göra just det? Vi har en mycket tydlig uppdelning här: <code class=\"docutils literal notranslate\">GET</code> förfrågningar bör få <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#DetailView\" title=\"DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a> (med <a class=\"reference internal\" href=\"/sv/6.1/ref/forms/api/#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\">Form</code></a> läggs till i kontextdata), och <code class=\"docutils literal notranslate\">POST</code> förfrågningar bör få <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#FormView\" title=\"FormView\"><code class=\"xref py py-class docutils literal notranslate\">FormView</code></a>. Låt oss ställa in dessa vyer först.</p>\n<p>Vyn <code class=\"docutils literal notranslate\">AuthorDetailView</code> är nästan densamma som <a class=\"reference internal\" href=\"/sv/6.1/topics/class-based-views/generic-display/#generic-views-extra-work\"><span class=\"std std-ref\">när vi först introducerade AuthorDetailView</span></a>; vi måste skriva vår egen <code class=\"docutils literal notranslate\">get_context_data()</code> för att göra <code class=\"docutils literal notranslate\">AuthorInterestForm</code> tillgänglig för mallen. Vi hoppar över <code class=\"docutils literal notranslate\">get_object()</code> överskrivningen från tidigare för tydlighetens skull:</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<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic</span> <span class=\"kn\">import</span> DetailView\n<span class=\"kn\">from</span> <span class=\"nn\">books.models</span> <span class=\"kn\">import</span> Author\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorInterestForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    message <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorDetailView</span><span class=\"p\">(</span>DetailView<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Author\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_context_data</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        context <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_context_data<span class=\"p\">(</span><span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n        context<span class=\"p\">[</span><span class=\"s2\">&quot;form&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> AuthorInterestForm<span class=\"p\">()</span>\n        <span class=\"k\">return</span> context\n</code></pre></div>\n<p>Då är <code class=\"docutils literal notranslate\">AuthorInterestFormView</code> en <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#FormView\" title=\"FormView\"><code class=\"xref py py-class docutils literal notranslate\">FormView</code></a>, men vi måste ta in <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin\" title=\"django.views.generic.detail.SingleObjectMixin\"><code class=\"xref py py-class docutils literal notranslate\">SingleObjectMixin</code></a> så att vi kan hitta den författare vi pratar om, och vi måste komma ihåg att ställa in <code class=\"docutils literal notranslate\">template_name</code> för att säkerställa att formulärfel kommer att göra samma mall som <code class=\"docutils literal notranslate\">AuthorDetailView</code> använder på <code class=\"docutils literal notranslate\">GET</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.http</span> <span class=\"kn\">import</span> HttpResponseForbidden\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> reverse\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic</span> <span class=\"kn\">import</span> FormView\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.detail</span> <span class=\"kn\">import</span> SingleObjectMixin\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorInterestFormView</span><span class=\"p\">(</span>SingleObjectMixin<span class=\"p\">,</span> FormView<span class=\"p\">):</span>\n    template_name <span class=\"o\">=</span> <span class=\"s2\">&quot;books/author_detail.html&quot;</span>\n    form_class <span class=\"o\">=</span> AuthorInterestForm\n    model <span class=\"o\">=</span> Author\n\n    <span class=\"k\">def</span> <span class=\"nf\">post</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> <span class=\"ow\">not</span> request<span class=\"o\">.</span>user<span class=\"o\">.</span>is_authenticated<span class=\"p\">:</span>\n            <span class=\"k\">return</span> HttpResponseForbidden<span class=\"p\">()</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>object <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_object<span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>post<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\">get_success_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>object<span class=\"o\">.</span>pk<span class=\"p\">})</span>\n</code></pre></div>\n<p>Till sist sammanför vi detta i en ny vy, <code class=\"docutils literal notranslate\">AuthorView</code>. Vi vet redan att ett anrop till <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\">as_view()</code></a> på en klassbaserad vy ger oss något som beter sig precis som en funktionsbaserad vy, så det kan vi göra där vi väljer mellan de två undervyerna.</p>\n<p>Du kan skicka vidare nyckelordsargument till <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/base/#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\">as_view()</code></a> på samma sätt som i URL-konfigurationen, till exempel om du vill att beteendet hos <code class=\"docutils literal notranslate\">AuthorInterestFormView</code> också ska visas på en annan URL men med en annan mall:</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.views</span> <span class=\"kn\">import</span> View\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorView</span><span class=\"p\">(</span>View<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get</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        view <span class=\"o\">=</span> AuthorDetailView<span class=\"o\">.</span>as_view<span class=\"p\">()</span>\n        <span class=\"k\">return</span> view<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\">post</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        view <span class=\"o\">=</span> AuthorInterestFormView<span class=\"o\">.</span>as_view<span class=\"p\">()</span>\n        <span class=\"k\">return</span> view<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</code></pre></div>\n<p>Detta tillvägagångssätt kan också användas med alla andra generiska klassbaserade vyer eller dina egna klassbaserade vyer som ärver direkt från <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#View\" title=\"View\"><code class=\"xref py py-class docutils literal notranslate\">View</code></a> eller <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/flattened-index/#TemplateView\" title=\"TemplateView\"><code class=\"xref py py-class docutils literal notranslate\">TemplateView</code></a>, eftersom det håller de olika vyerna så separata som möjligt.</p>\n</section>\n</section>\n<section id=\"more-than-just-html\">\n<span id=\"jsonresponsemixin-example\"></span><h2>Mer än bara HTML<a class=\"heading-anchor\" href=\"#more-than-just-html\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Klassbaserade vyer är perfekta när du vill göra samma sak många gånger. Anta att du skriver ett API och att varje vy ska returnera JSON istället för renderad HTML.</p>\n<p>Vi kan skapa en mixin-klass som kan användas i alla våra vyer och hantera konverteringen till JSON en gång.</p>\n<p>Till exempel kan en JSON-mixin se ut ungefär 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=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> JsonResponse\n\n\n<span class=\"k\">class</span> <span class=\"nc\">JSONResponseMixin</span><span class=\"p\">:</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    A mixin that can be used to render a JSON response.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">render_to_json_response</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">,</span> <span class=\"o\">**</span>response_kwargs<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns a JSON response, transforming &#39;context&#39; to make the payload.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">return</span> JsonResponse<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>get_data<span class=\"p\">(</span>context<span class=\"p\">),</span> <span class=\"o\">**</span>response_kwargs<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_data</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns an object that will be serialized as JSON by json.dumps().</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"c1\"># Note: This is *EXTREMELY* naive; in reality, you&#39;ll need</span>\n        <span class=\"c1\"># to do much more complex handling to ensure that arbitrary</span>\n        <span class=\"c1\"># objects -- such as Django model instances or querysets</span>\n        <span class=\"c1\"># -- can be serialized as JSON.</span>\n        <span class=\"k\">return</span> context\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Kolla in <a class=\"reference internal\" href=\"/sv/6.1/topics/serialization/\"><span class=\"doc\">Serialisering av Django-objekt</span></a>-dokumentationen för mer information om hur man korrekt omvandlar Django-modeller och querysets till JSON.</p>\n</aside>\n<p>Denna mixin tillhandahåller en metod <code class=\"docutils literal notranslate\">render_to_json_response()</code> med samma signatur som <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.render_to_response\" title=\"django.views.generic.base.TemplateResponseMixin.render_to_response\"><code class=\"xref py py-func docutils literal notranslate\">render_to_response()</code></a>. För att använda den behöver vi till exempel blanda in den i en <code class=\"docutils literal notranslate\">TemplateView</code> och åsidosätta <code class=\"docutils literal notranslate\">render_to_response()</code> så att den i stället anropar <code class=\"docutils literal notranslate\">render_to_json_response()</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.views.generic</span> <span class=\"kn\">import</span> TemplateView\n\n\n<span class=\"k\">class</span> <span class=\"nc\">JSONView</span><span class=\"p\">(</span>JSONResponseMixin<span class=\"p\">,</span> TemplateView<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">render_to_response</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">,</span> <span class=\"o\">**</span>response_kwargs<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>render_to_json_response<span class=\"p\">(</span>context<span class=\"p\">,</span> <span class=\"o\">**</span>response_kwargs<span class=\"p\">)</span>\n</code></pre></div>\n<p>På samma sätt kan vi använda vår mixin med en av de generiska vyerna. Vi kan göra vår egen version av <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.detail.DetailView\" title=\"django.views.generic.detail.DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a> genom att blanda <code class=\"docutils literal notranslate\">JSONResponseMixin</code> med <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.detail.BaseDetailView\" title=\"django.views.generic.detail.BaseDetailView\"><code class=\"xref py py-class docutils literal notranslate\">BaseDetailView</code></a> – (<a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.detail.DetailView\" title=\"django.views.generic.detail.DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a> innan mallrenderingsbeteendet har blandats in):</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.views.generic.detail</span> <span class=\"kn\">import</span> BaseDetailView\n\n\n<span class=\"k\">class</span> <span class=\"nc\">JSONDetailView</span><span class=\"p\">(</span>JSONResponseMixin<span class=\"p\">,</span> BaseDetailView<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">render_to_response</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">,</span> <span class=\"o\">**</span>response_kwargs<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>render_to_json_response<span class=\"p\">(</span>context<span class=\"p\">,</span> <span class=\"o\">**</span>response_kwargs<span class=\"p\">)</span>\n</code></pre></div>\n<p>Denna vy kan sedan distribueras på samma sätt som alla andra <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.detail.DetailView\" title=\"django.views.generic.detail.DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a>, med exakt samma beteende - förutom svarets format.</p>\n<p>Om du vill vara riktigt äventyrlig kan du till och med blanda in en underklass till <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/generic-display/#django.views.generic.detail.DetailView\" title=\"django.views.generic.detail.DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a> som kan returnera <em>både</em> HTML- och JSON-innehåll, beroende på någon egenskap hos HTTP-begäran, till exempel ett frågeargument eller en HTTP-header. Blanda in både <code class=\"docutils literal notranslate\">JSONResponseMixin</code> och <a class=\"reference internal\" href=\"/sv/6.1/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>, och åsidosätt implementationen av <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.render_to_response\" title=\"django.views.generic.base.TemplateResponseMixin.render_to_response\"><code class=\"xref py py-func docutils literal notranslate\">render_to_response()</code></a> så att den delegerar till lämplig renderingsmetod beroende på vilken svarstyp användaren begärde:</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.views.generic.detail</span> <span class=\"kn\">import</span> SingleObjectTemplateResponseMixin\n\n\n<span class=\"k\">class</span> <span class=\"nc\">HybridDetailView</span><span class=\"p\">(</span>\n    JSONResponseMixin<span class=\"p\">,</span> SingleObjectTemplateResponseMixin<span class=\"p\">,</span> BaseDetailView\n<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">render_to_response</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> context<span class=\"p\">):</span>\n        <span class=\"c1\"># Look for a &#39;format=json&#39; GET argument</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span>request<span class=\"o\">.</span>GET<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s2\">&quot;format&quot;</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;json&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>render_to_json_response<span class=\"p\">(</span>context<span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>render_to_response<span class=\"p\">(</span>context<span class=\"p\">)</span>\n</code></pre></div>\n<p>På grund av hur Python löser metodöverladdning kommer anropet till <code class=\"docutils literal notranslate\">super().render_to_response(context)</code> till slut att anropa implementationen av <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin.render_to_response\" title=\"django.views.generic.base.TemplateResponseMixin.render_to_response\"><code class=\"xref py py-meth docutils literal notranslate\">render_to_response()</code></a> i <a class=\"reference internal\" href=\"/sv/6.1/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>.</p>\n</section>","rootId":"using-mixins-with-class-based-views","toc":[{"title":"Sammanhang och svarsmallar","anchor":"context-and-template-responses","children":[]},{"title":"Uppbyggnad av Djangos generiska klassbaserade vyer","anchor":"building-up-django-s-generic-class-based-views","children":[{"title":"DetailView: att arbeta med ett enda Django-objekt","anchor":"detailview-working-with-a-single-django-object","children":[]},{"title":"ListView: arbeta med många Django-objekt","anchor":"listview-working-with-many-django-objects","children":[]}]},{"title":"Använda Djangos klassbaserade vy-mixins","anchor":"using-django-s-class-based-view-mixins","children":[{"title":"Använda SingleObjectMixin med View","anchor":"using-singleobjectmixin-with-view","children":[]},{"title":"Använda SingleObjectMixin med ListView","anchor":"using-singleobjectmixin-with-listview","children":[]}]},{"title":"Undvik allt som är mer komplicerat","anchor":"avoid-anything-more-complex","children":[{"title":"Använda FormMixin med DetailView","anchor":"using-formmixin-with-detailview","children":[]},{"title":"En bättre lösning","anchor":"a-better-solution","children":[]},{"title":"En alternativ bättre lösning","anchor":"an-alternative-better-solution","children":[]}]},{"title":"Mer än bara HTML","anchor":"more-than-just-html","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.1/topics/"},{"docname":"topics/class-based-views/index","title":"Klassbaserade åsikter","url":"/sv/6.1/topics/class-based-views/"}],"prev":{"docname":"topics/class-based-views/generic-editing","title":"Formulärhantering med klassbaserade vyer","url":"/sv/6.1/topics/class-based-views/generic-editing/"},"next":{"docname":"topics/migrations","title":"Migreringar","url":"/sv/6.1/topics/migrations/"},"formats":{"html":"/sv/6.1/topics/class-based-views/mixins/","markdown":"/sv/6.1/topics/class-based-views/mixins.md","json":"/sv/6.1/topics/class-based-views/mixins.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/class-based-views/mixins.txt","official":"https://docs.djangoproject.com/sv/6.1/topics/class-based-views/mixins/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}