{"title":"Använda mixins med klassbaserade vyer","version":"6.0","locale":"sv","docname":"topics/class-based-views/mixins","url":"/sv/6.0/topics/class-based-views/mixins/","canonical":"https://djangodocs.dev/sv/6.0/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>This is an advanced topic. A working knowledge of <a class=\"reference internal\" href=\"/sv/6.0/topics/class-based-views/\"><span class=\"doc\">Django’s\nclass-based views</span></a> is advised before\nexploring these techniques.</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.0/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.0/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.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>. Djangos referensdokumentation innehåller <a class=\"reference internal\" href=\"/sv/6.0/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.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></dt><dd><p>Every built in view which returns a\n<a class=\"reference internal\" href=\"/sv/6.0/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\">TemplateResponse</code></a> will call the\n<a class=\"reference internal\" href=\"/sv/6.0/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>\nmethod that <code class=\"docutils literal notranslate\">TemplateResponseMixin</code> provides. Most of the time this\nwill be called for you (for instance, it is called by the <code class=\"docutils literal notranslate\">get()</code> method\nimplemented by both <a class=\"reference internal\" href=\"/sv/6.0/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> and\n<a class=\"reference internal\" href=\"/sv/6.0/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>); similarly, it’s unlikely\nthat you’ll need to override it, although if you want your response to\nreturn something not rendered via a Django template then you’ll want to do\nit. For an example of this, see the <a class=\"reference internal\" href=\"#jsonresponsemixin-example\"><span class=\"std std-ref\">JSONResponseMixin example</span></a>.</p>\n<p><code class=\"docutils literal notranslate\">render_to_response()</code> själv anropar <a class=\"reference internal\" href=\"/sv/6.0/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.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> på den klassbaserade vyn; två andra mixins (<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> och <a class=\"reference internal\" href=\"/sv/6.0/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.0/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>Every built in view which needs context data, such as for rendering a\ntemplate (including <code class=\"docutils literal notranslate\">TemplateResponseMixin</code> above), should call\n<a class=\"reference internal\" href=\"/sv/6.0/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> passing\nany data they want to ensure is in there as keyword arguments.\n<code class=\"docutils literal notranslate\">get_context_data()</code> returns a dictionary; in <code class=\"docutils literal notranslate\">ContextMixin</code> it\nreturns its keyword arguments, but it is common to override this to add\nmore members to the dictionary. You can also use the\n<a class=\"reference internal\" href=\"/sv/6.0/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> attribute.</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.0/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.0/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.0/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.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>, <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> och <a class=\"reference internal\" href=\"/sv/6.0/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.0/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.0/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>To get the object, <a class=\"reference internal\" href=\"/sv/6.0/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>\nrelies on <a class=\"reference internal\" href=\"/sv/6.0/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>,\nwhich provides a\n<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>\nmethod that figures out the object based on the URL of the request (it\nlooks for <code class=\"docutils literal notranslate\">pk</code> and <code class=\"docutils literal notranslate\">slug</code> keyword arguments as declared in the\nURLConf, and looks the object up either from the\n<a class=\"reference internal\" href=\"/sv/6.0/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> attribute\non the view, or the\n<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>\nattribute if that’s provided). <code class=\"docutils literal notranslate\">SingleObjectMixin</code> also overrides\n<a class=\"reference internal\" href=\"/sv/6.0/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>,\nwhich is used across all Django’s built in class-based views to supply\ncontext data for template renders.</p>\n<p>To then make a <a class=\"reference internal\" href=\"/sv/6.0/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\">TemplateResponse</code></a>,\n<a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/flattened-index/#DetailView\" title=\"DetailView\"><code class=\"xref py py-class docutils literal notranslate\">DetailView</code></a> uses\n<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>, which\nextends <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>, overriding\n<a class=\"reference internal\" href=\"/sv/6.0/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> as\ndiscussed above. It actually provides a fairly sophisticated set of options,\nbut the main one that most people are going to use is\n<code class=\"docutils literal notranslate\">&lt;app_label&gt;/&lt;model_name&gt;_detail.html</code>. The <code class=\"docutils literal notranslate\">_detail</code> part can be changed\nby setting\n<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>\non a subclass to something else. (For instance, the <a class=\"reference internal\" href=\"/sv/6.0/topics/class-based-views/generic-editing/\"><span class=\"doc\">generic edit views</span></a> use <code class=\"docutils literal notranslate\">_form</code> for create and\nupdate views, and <code class=\"docutils literal notranslate\">_confirm_delete</code> for delete views.)</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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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> also overrides\n<a class=\"reference internal\" href=\"/sv/6.0/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> to\ninclude appropriate context variables for pagination (providing\ndummies if pagination is disabled). It relies on <code class=\"docutils literal notranslate\">object_list</code> being\npassed in as a keyword argument, which <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/flattened-index/#ListView\" title=\"ListView\"><code class=\"xref py py-class docutils literal notranslate\">ListView</code></a> arranges for\nit.</p>\n<p>För att göra en <a class=\"reference internal\" href=\"/sv/6.0/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.0/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.0/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>; som med <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> ovan, åsidosätter detta <code class=\"docutils literal notranslate\">get_template_names()</code> för att tillhandahålla <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectTemplateResponseMixin\" title=\"django.views.generic.list.MultipleObjectTemplateResponseMixin\"><code class=\"xref py py-meth docutils literal notranslate\">en rad alternativ</code></a>, där det vanligaste är <code class=\"docutils literal notranslate\">&lt;app_label&gt;/&lt;model_name&gt;_list.html</code>, där <code class=\"docutils literal notranslate\">_list</code>-delen återigen hämtas från attributet <a class=\"reference internal\" href=\"/sv/6.0/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.0/ref/class-based-views/\"><span class=\"doc\">class-based views</span></a> och <a class=\"reference internal\" href=\"/sv/6.0/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.0/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.0/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.0/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.0/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.0/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.0/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>We’ll demonstrate this with the <code class=\"docutils literal notranslate\">Author</code> model we used in the <a class=\"reference internal\" href=\"/sv/6.0/topics/class-based-views/generic-display/\"><span class=\"doc\">generic\nclass-based views introduction</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.0/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.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> 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.0/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.0/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.0/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.0/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.0/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.0/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 for use in <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></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.0/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.0/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.0/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.0/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.0/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.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> och <a class=\"reference internal\" href=\"/sv/6.0/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.0/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>Each of your views should use only mixins or views from one of the groups\nof generic class-based views: <a class=\"reference internal\" href=\"/sv/6.0/topics/class-based-views/generic-display/\"><span class=\"doc\">detail, list</span></a>, <a class=\"reference internal\" href=\"/sv/6.0/topics/class-based-views/generic-editing/\"><span class=\"doc\">editing</span></a> and date. For example it’s\nfine to combine <a class=\"reference internal\" href=\"/sv/6.0/ref/class-based-views/flattened-index/#TemplateView\" title=\"TemplateView\"><code class=\"xref py py-class docutils literal notranslate\">TemplateView</code></a> (built in view) with\n<a class=\"reference internal\" href=\"/sv/6.0/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> (generic list), but\nyou’re likely to have problems combining <code class=\"docutils literal notranslate\">SingleObjectMixin</code> (generic\ndetail) with <code class=\"docutils literal notranslate\">MultipleObjectMixin</code> (generic list).</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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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>Finally we bring this together in a new <code class=\"docutils literal notranslate\">AuthorView</code> view. We\nalready know that calling <a class=\"reference internal\" href=\"/sv/6.0/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> on\na class-based view gives us something that behaves exactly like a function\nbased view, so we can do that at the point we choose between the two subviews.</p>\n<p>You can pass through keyword arguments to\n<a class=\"reference internal\" href=\"/sv/6.0/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> in the same way you\nwould in your URLconf, such as if you wanted the <code class=\"docutils literal notranslate\">AuthorInterestFormView</code>\nbehavior to also appear at another URL but using a different template:</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.0/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.0/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.0/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>This mixin provides a <code class=\"docutils literal notranslate\">render_to_json_response()</code> method with the same\nsignature as\n<a class=\"reference internal\" href=\"/sv/6.0/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>.\nTo use it, we need to mix it into a <code class=\"docutils literal notranslate\">TemplateView</code> for example, and override\n<code class=\"docutils literal notranslate\">render_to_response()</code> to call <code class=\"docutils literal notranslate\">render_to_json_response()</code> instead:</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.0/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.0/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.0/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.0/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>If you want to be really adventurous, you could even mix a\n<a class=\"reference internal\" href=\"/sv/6.0/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> subclass that is able\nto return <em>both</em> HTML and JSON content, depending on some property of\nthe HTTP request, such as a query argument or an HTTP header. Mix in both the\n<code class=\"docutils literal notranslate\">JSONResponseMixin</code> and a\n<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>,\nand override the implementation of\n<a class=\"reference internal\" href=\"/sv/6.0/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>\nto defer to the appropriate rendering method depending on the type of response\nthat the user requested:</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>Because of the way that Python resolves method overloading, the call to\n<code class=\"docutils literal notranslate\">super().render_to_response(context)</code> ends up calling the\n<a class=\"reference internal\" href=\"/sv/6.0/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>\nimplementation of <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>.</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.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-editing","title":"Formulärhantering med klassbaserade vyer","url":"/sv/6.0/topics/class-based-views/generic-editing/"},"next":{"docname":"topics/migrations","title":"Migreringar","url":"/sv/6.0/topics/migrations/"},"formats":{"html":"/sv/6.0/topics/class-based-views/mixins/","markdown":"/sv/6.0/topics/class-based-views/mixins.md","json":"/sv/6.0/topics/class-based-views/mixins.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/class-based-views/mixins.txt","official":"https://docs.djangoproject.com/sv/6.0/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"]}