{"title":"Klassbaserade åsikter","version":"6.1","locale":"sv","docname":"topics/class-based-views/index","url":"/sv/6.1/topics/class-based-views/","canonical":"https://djangodocs.dev/sv/6.1/topics/class-based-views/","summary":"En view är en callable som tar emot en request och returnerar ett svar. Detta kan vara mer än bara en funktion, och Django ger ett exempel på några klasser…","html":"<h1>Klassbaserade åsikter<a class=\"heading-anchor\" href=\"#class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>En view är en callable som tar emot en request och returnerar ett svar. Detta kan vara mer än bara en funktion, och Django ger ett exempel på några klasser som kan användas som vyer. Dessa gör att du kan strukturera dina vyer och återanvända kod genom att utnyttja arv och mixins. Det finns också några generiska vyer för uppgifter som vi kommer till senare, men du kanske vill utforma din egen struktur av återanvändbara vyer som passar ditt användningsfall. För fullständiga detaljer, se <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/\"><span class=\"doc\">class-based views reference documentation</span></a>.</p>\n<div class=\"toctree-wrapper compound\">\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/sv/6.1/topics/class-based-views/intro/\">Introduktion till klassbaserade vyer</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/sv/6.1/topics/class-based-views/generic-display/\">Inbyggda klassbaserade generiska vyer</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/sv/6.1/topics/class-based-views/generic-editing/\">Formulärhantering med klassbaserade vyer</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/sv/6.1/topics/class-based-views/mixins/\">Använda mixins med klassbaserade vyer</a></li>\n</ul>\n</div>\n<aside class=\"admonition-there-are-community-maintained-solutions admonition\" role=\"note\">\n<p class=\"admonition-title\">Det finns lösningar som underhålls av communityn!</p>\n<p>Django har ett livfullt ekosystem. På sidan <a class=\"reference external\" href=\"https://www.djangoproject.com/community/ecosystem/#forms-views\">Community Ecosystem</a> finns utökningar för generiska vyer som bygger på Djangos klassbaserade vyer. Django Packages <a class=\"reference external\" href=\"https://djangopackages.org/grids/g/cbv/\">Class Based Views grid</a> erbjuder ännu fler alternativ!</p>\n</aside>\n<section id=\"basic-examples\">\n<h2>Grundläggande exempel<a class=\"heading-anchor\" href=\"#basic-examples\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django tillhandahåller basvyklasser som passar ett brett spektrum av applikationer. Alla vyer ärver från <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>-klassen, som hanterar länkning av vyn till webbadresserna, HTTP-metodutskick och andra vanliga funktioner. <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/base/#django.views.generic.base.RedirectView\" title=\"django.views.generic.base.RedirectView\"><code class=\"xref py py-class docutils literal notranslate\">RedirectView</code></a> tillhandahåller en HTTP-omdirigering, och <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> utökar basklassen så att den också kan rendera en mall.</p>\n</section>\n<section id=\"usage-in-your-urlconf\">\n<h2>Användning i din URLconf<a class=\"heading-anchor\" href=\"#usage-in-your-urlconf\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Det mest direkta sättet att använda generiska vyer är att skapa dem direkt i din URLconf. Om du bara ändrar några få attribut på en klassbaserad vy kan du skicka dem 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> metodanropet själv:</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.urls</span> <span class=\"kn\">import</span> path\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic</span> <span class=\"kn\">import</span> TemplateView\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;about/&quot;</span><span class=\"p\">,</span> TemplateView<span class=\"o\">.</span>as_view<span class=\"p\">(</span>template_name<span class=\"o\">=</span><span class=\"s2\">&quot;about.html&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Eventuella argument som skickas 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> kommer att åsidosätta attribut som ställts in på klassen. I det här exemplet ställer vi in <code class=\"docutils literal notranslate\">template_name</code> på <code class=\"docutils literal notranslate\">TemplateView</code>. Ett liknande åsidosättningsmönster kan användas för attributet <code class=\"docutils literal notranslate\">url</code> på <a class=\"reference internal\" href=\"/sv/6.1/ref/class-based-views/base/#django.views.generic.base.RedirectView\" title=\"django.views.generic.base.RedirectView\"><code class=\"xref py py-class docutils literal notranslate\">RedirectView</code></a>.</p>\n</section>\n<section id=\"subclassing-generic-views\">\n<h2>Underklassificering av generiska vyer<a class=\"heading-anchor\" href=\"#subclassing-generic-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Det andra, mer kraftfulla sättet att använda generiska vyer är att ärva från en befintlig vy och åsidosätta attribut (t.ex. <code class=\"docutils literal notranslate\">template_name</code>) eller metoder (t.ex. <code class=\"docutils literal notranslate\">get_context_data</code>) i din underklass för att tillhandahålla nya värden eller metoder. Tänk till exempel på en vy som bara visar en mall, <code class=\"docutils literal notranslate\">about.html</code>. Django har en generisk vy för att göra detta - <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> - så vi kan subklassa den och åsidosätta mallnamnet:</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\"># some_app/views.py</span>\n<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\">AboutView</span><span class=\"p\">(</span>TemplateView<span class=\"p\">):</span>\n    template_name <span class=\"o\">=</span> <span class=\"s2\">&quot;about.html&quot;</span>\n</code></pre></div>\n<p>Sedan måste vi lägga till den här nya vyn i vår URLconf. <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> är en klass, inte en funktion, så vi pekar URL:en till klassmetoden <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> istället, som ger en funktionsliknande ingång till klassbaserade vyer:</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\"># urls.py</span>\n<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\">some_app.views</span> <span class=\"kn\">import</span> AboutView\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;about/&quot;</span><span class=\"p\">,</span> AboutView<span class=\"o\">.</span>as_view<span class=\"p\">()),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Mer information om hur du använder de inbyggda generiska vyerna finns i nästa ämne i <a class=\"reference internal\" href=\"/sv/6.1/topics/class-based-views/generic-display/\"><span class=\"doc\">generiska klassbaserade vyer</span></a>.</p>\n<section id=\"supporting-other-http-methods\">\n<span id=\"id1\"></span><h3>Stöd för andra HTTP-metoder<a class=\"heading-anchor\" href=\"#supporting-other-http-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Anta att någon vill komma åt vårt bokbibliotek via HTTP med hjälp av vyerna som ett API. API-klienten skulle ansluta då och då och ladda ner bokdata för de böcker som publicerats sedan förra besöket. Men om inga nya böcker har dykt upp sedan dess är det slöseri med CPU-tid och bandbredd att hämta böckerna från databasen, rendera ett fullständigt svar och skicka det till klienten. Det kan vara att föredra att fråga API:et när den senaste boken publicerades.</p>\n<p>Vi mappar URL:en till boklistans vy i URLconf:</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.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> BookListView\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;books/&quot;</span><span class=\"p\">,</span> BookListView<span class=\"o\">.</span>as_view<span class=\"p\">()),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Och utsikten:</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> HttpResponse\n<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\">books.models</span> <span class=\"kn\">import</span> Book\n\n\n<span class=\"k\">class</span> <span class=\"nc\">BookListView</span><span class=\"p\">(</span>ListView<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Book\n\n    <span class=\"k\">def</span> <span class=\"nf\">head</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        last_book <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_queryset<span class=\"p\">()</span><span class=\"o\">.</span>latest<span class=\"p\">(</span><span class=\"s2\">&quot;publication_date&quot;</span><span class=\"p\">)</span>\n        response <span class=\"o\">=</span> HttpResponse<span class=\"p\">(</span>\n            <span class=\"c1\"># RFC 1123 date format.</span>\n            headers<span class=\"o\">=</span><span class=\"p\">{</span>\n                <span class=\"s2\">&quot;Last-Modified&quot;</span><span class=\"p\">:</span> last_book<span class=\"o\">.</span>publication_date<span class=\"o\">.</span>strftime<span class=\"p\">(</span>\n                    <span class=\"s2\">&quot;</span><span class=\"si\">%a</span><span class=\"s2\">, </span><span class=\"si\">%d</span><span class=\"s2\"> %b %Y %H:%M:%S GMT&quot;</span>\n                <span class=\"p\">)</span>\n            <span class=\"p\">},</span>\n        <span class=\"p\">)</span>\n        <span class=\"k\">return</span> response\n</code></pre></div>\n<p>Om vyn nås med en <code class=\"docutils literal notranslate\">GET</code>-begäran returneras en objektlista i svaret (med mallen <code class=\"docutils literal notranslate\">book_list.html</code>). Men om klienten skickar en <code class=\"docutils literal notranslate\">HEAD</code>-begäran har svaret en tom brödtext och headern <code class=\"docutils literal notranslate\">Last-Modified</code> anger när den senaste boken publicerades. Baserat på den informationen kan klienten välja att hämta hela objektlistan eller låta bli.</p>\n</section>\n</section>\n<section id=\"asynchronous-class-based-views\">\n<span id=\"async-class-based-views\"></span><h2>Asynkrona klassbaserade visningar<a class=\"heading-anchor\" href=\"#asynchronous-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Förutom de synkrona (<code class=\"docutils literal notranslate\">def</code>) metodhanterare som redan visats, kan <code class=\"docutils literal notranslate\">View</code> subklasser definiera asynkrona (<code class=\"docutils literal notranslate\">async def</code>) metodhanterare för att utnyttja asynkron kod med hjälp av <code class=\"docutils literal notranslate\">await</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\">import</span> <span class=\"nn\">asyncio</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n<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\">AsyncView</span><span class=\"p\">(</span>View<span class=\"p\">):</span>\n    <span class=\"k\">async</span> <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=\"c1\"># Perform io-blocking view logic using await, sleep for example.</span>\n        <span class=\"k\">await</span> asyncio<span class=\"o\">.</span>sleep<span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span><span class=\"s2\">&quot;Hello async world!&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Inom en och samma view-klass måste alla användardefinierade metodhanterare vara antingen synkrona, med <code class=\"docutils literal notranslate\">def</code>, eller asynkrona, med <code class=\"docutils literal notranslate\">async def</code>. Ett <code class=\"docutils literal notranslate\">ImproperlyConfigured</code> undantag kommer att uppstå i <code class=\"docutils literal notranslate\">as_view()</code> om <code class=\"docutils literal notranslate\">def</code> och <code class=\"docutils literal notranslate\">async def</code> deklarationer blandas.</p>\n<p>Django kommer automatiskt att upptäcka asynkrona vyer och köra dem i ett asynkront sammanhang. Du kan läsa mer om Djangos asynkrona stöd, och hur du bäst använder asynkrona vyer, i <a class=\"reference internal\" href=\"/sv/6.1/topics/async/\"><span class=\"doc\">Asynkront stöd</span></a>.</p>\n</section>","rootId":"class-based-views","toc":[{"title":"Grundläggande exempel","anchor":"basic-examples","children":[]},{"title":"Användning i din URLconf","anchor":"usage-in-your-urlconf","children":[]},{"title":"Underklassificering av generiska vyer","anchor":"subclassing-generic-views","children":[{"title":"Stöd för andra HTTP-metoder","anchor":"supporting-other-http-methods","children":[]}]},{"title":"Asynkrona klassbaserade visningar","anchor":"asynchronous-class-based-views","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.1/topics/"}],"prev":{"docname":"topics/templates","title":"Mallar","url":"/sv/6.1/topics/templates/"},"next":{"docname":"topics/class-based-views/intro","title":"Introduktion till klassbaserade vyer","url":"/sv/6.1/topics/class-based-views/intro/"},"formats":{"html":"/sv/6.1/topics/class-based-views/","markdown":"/sv/6.1/topics/class-based-views.md","json":"/sv/6.1/topics/class-based-views.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/class-based-views/index.txt","official":"https://docs.djangoproject.com/sv/6.1/topics/class-based-views/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}