{"title":"Administrativa åtgärder","version":"6.1","locale":"sv","docname":"ref/contrib/admin/actions","url":"/sv/6.1/ref/contrib/admin/actions/","canonical":"https://djangodocs.dev/sv/6.1/ref/contrib/admin/actions/","summary":"Det grundläggande arbetsflödet i Djangos admin är, i ett nötskal, ”välj ett objekt och ändra det sedan” Detta fungerar bra för en majoritet av användningsfallen.…","html":"<h1>Administrativa åtgärder<a class=\"heading-anchor\" href=\"#admin-actions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Det grundläggande arbetsflödet i Djangos admin är, i ett nötskal, ”välj ett objekt och ändra det sedan” Detta fungerar bra för en majoritet av användningsfallen. Men om du behöver göra samma ändring på många objekt samtidigt kan detta arbetsflöde vara ganska tråkigt.</p>\n<p>I dessa fall låter Djangos admin dig skriva och registrera ”åtgärder” - funktioner som anropas med en lista över objekt som valts på sidan med ändringslistan.</p>\n<p>Om du tittar på någon ändringslista i administratören ser du den här funktionen i aktion; Django levereras med en åtgärd ”ta bort valda objekt” som är tillgänglig för alla modeller. Till exempel:, här är användarmodulen från Djangos inbyggda <a class=\"reference internal\" href=\"/sv/6.1/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code></a> app:</p>\n<img alt=\"/sv/6.1/_images/admin-actions.png\" src=\"/sv/6.1/_images/admin-actions.png\" />\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Åtgärden ”ta bort valda objekt” använder <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet.delete\" title=\"django.db.models.query.QuerySet.delete\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.delete()</span></code></a> av effektivitetsskäl, vilket har en viktig varning: din modells metod <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> kommer inte att anropas.</p>\n<p>Om du vill åsidosätta detta beteende kan du åsidosätta <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.delete_queryset\" title=\"django.contrib.admin.ModelAdmin.delete_queryset\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.delete_queryset()</span></code></a> eller skriva en anpassad åtgärd som gör borttagningen på det sätt du föredrar - till exempel genom att anropa <code class=\"docutils literal notranslate\"><span class=\"pre\">Model.delete()</span></code> för vart och ett av de valda objekten.</p>\n<p>Mer information om bulkdeletion finns i dokumentationen om <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/#topics-db-queries-delete\"><span class=\"std std-ref\">object deletion</span></a>.</p>\n</aside>\n<p>Läs vidare för att ta reda på hur du lägger till dina egna åtgärder i listan.</p>\n<section id=\"writing-actions\">\n<h2>Skriva åtgärder<a class=\"heading-anchor\" href=\"#writing-actions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Det enklaste sättet att förklara åtgärder är genom exempel, så låt oss dyka ner i det.</p>\n<p>Ett vanligt användningsfall för adminåtgärder är massuppdatering av en modell. Föreställ dig en nyhetsapplikation med en <code class=\"docutils literal notranslate\"><span class=\"pre\">Artikel</span></code>-modell:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"n\">STATUS_CHOICES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;d&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Draft&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;p&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Published&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;w&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Withdrawn&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">body</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n    <span class=\"n\">status</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"n\">STATUS_CHOICES</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">title</span>\n</code></pre></div>\n<p>En vanlig uppgift som vi kan utföra med en sådan här modell är att uppdatera en artikels status från ”utkast” till ”publicerad”. Vi kan enkelt göra detta i administratören för en artikel i taget, men om vi vill masspublicera en grupp artiklar skulle det vara tråkigt. Så låt oss skriva en åtgärd som låter oss ändra en artikels status till ”publicerad”</p>\n<section id=\"writing-action-functions\">\n<span id=\"action-function\"></span><h3>Skriva handlingsfunktioner<a class=\"heading-anchor\" href=\"#writing-action-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Först måste vi skriva en funktion som anropas när åtgärden utlöses från administratören. Åtgärdsfunktioner är vanliga funktioner som tar tre argument:</p>\n<ul class=\"simple\">\n<li><p>Den aktuella <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a></p></li>\n<li><p>En <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> som representerar den aktuella begäran,</p></li>\n<li><p>En <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> som innehåller den uppsättning objekt som användaren har valt.</p></li>\n</ul>\n<p>Vår funktion publish-these-articles kommer inte att behöva <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> eller request-objektet, men vi kommer att använda queryset:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>För bästa prestanda använder vi querysets <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/#topics-db-queries-update\"><span class=\"std std-ref\">uppdateringsmetod</span></a>. Andra typer av åtgärder kan behöva hantera varje objekt individuellt; i dessa fall skulle vi iterera över queryset:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">for</span> <span class=\"n\">obj</span> <span class=\"ow\">in</span> <span class=\"n\">queryset</span><span class=\"p\">:</span>\n    <span class=\"n\">do_something_with</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n<p>Det är faktiskt allt som krävs för att skriva en åtgärd! Vi ska dock ta ytterligare ett valfritt men användbart steg och ge åtgärden en ”fin” titel i admin. Som standard visas den här åtgärden i åtgärdslistan som ”Gör publicerad” - funktionsnamnet, med understreck ersatta av mellanslag. Det är bra, men vi kan ge ett bättre, mer människovänligt namn genom att använda <a class=\"reference internal\" href=\"#django.contrib.admin.action\" title=\"django.contrib.admin.action\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">action()</span></code></a>-dekoratorn på <code class=\"docutils literal notranslate\"><span class=\"pre\">make_published</span></code>-funktionen:</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=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"o\">...</span>\n\n\n<span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span><span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;Mark selected stories as published&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Detta kanske ser bekant ut; admins <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_display</span></code></a>-alternativ använder en liknande teknik med <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">display()</span></code></a>-dekoratorn för att tillhandahålla mänskligt läsbara beskrivningar för återuppringningsfunktioner som registreras där också.</p>\n</aside>\n</section>\n<section id=\"adding-actions-to-the-modeladmin\">\n<h3>Lägga till åtgärder till <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a><a class=\"heading-anchor\" href=\"#adding-actions-to-the-modeladmin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Därefter måste vi informera vår <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> om åtgärden. Detta fungerar precis som alla andra konfigurationsalternativ. Så, den kompletta <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> med åtgärden och dess registrering skulle se 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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span>\n\n\n<span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span><span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;Mark selected stories as published&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">list_display</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;status&quot;</span><span class=\"p\">]</span>\n    <span class=\"n\">ordering</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">]</span>\n    <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">make_published</span><span class=\"p\">]</span>\n\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Article</span><span class=\"p\">,</span> <span class=\"n\">ArticleAdmin</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Den koden kommer att ge oss en ändringslista för administratörer som ser ut ungefär så här:</p>\n<img alt=\"/sv/6.1/_images/adding-actions-to-the-modeladmin.png\" src=\"/sv/6.1/_images/adding-actions-to-the-modeladmin.png\" />\n<p>Det är verkligen allt som behövs! Om du är sugen på att skriva dina egna åtgärder vet du nu tillräckligt för att komma igång. Resten av det här dokumentet handlar om mer avancerade tekniker.</p>\n</section>\n<section id=\"handling-errors-in-actions\">\n<h3>Hantering av fel i åtgärder<a class=\"heading-anchor\" href=\"#handling-errors-in-actions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om det finns förutsebara felförhållanden som kan uppstå när du kör din åtgärd, bör du på ett elegant sätt informera användaren om problemet. Detta innebär att hantera undantag och använda <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.message_user\" title=\"django.contrib.admin.ModelAdmin.message_user\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">django.contrib.admin.ModelAdmin.message_user()</span></code></a> för att visa en användarvänlig beskrivning av problemet i svaret.</p>\n</section>\n</section>\n<section id=\"advanced-action-techniques\">\n<h2>Avancerade handlingstekniker<a class=\"heading-anchor\" href=\"#advanced-action-techniques\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Det finns ett par extra alternativ och möjligheter som du kan utnyttja för mer avancerade alternativ.</p>\n<section id=\"actions-as-modeladmin-methods\">\n<h3>Åtgärder som <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a>-metoder<a class=\"heading-anchor\" href=\"#actions-as-modeladmin-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>I exemplet ovan är åtgärden <code class=\"docutils literal notranslate\"><span class=\"pre\">make_published</span></code> definierad som en funktion. Det är helt okej, men det är inte perfekt ur en koddesignsynpunkt: eftersom åtgärden är tätt kopplad till objektet <code class=\"docutils literal notranslate\"><span class=\"pre\">Article</span></code> är det vettigt att koppla åtgärden till själva objektet <code class=\"docutils literal notranslate\"><span class=\"pre\">ArticleAdmin</span></code>.</p>\n<p>Du kan göra det så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;make_published&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span><span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;Mark selected stories as published&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n        <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Lägg först märke till att vi har flyttat <code class=\"docutils literal notranslate\"><span class=\"pre\">make_published</span></code> till en metod och bytt namn på parametern <code class=\"docutils literal notranslate\"><span class=\"pre\">modeladmin</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">self</span></code>, och sedan att vi nu har lagt strängen <code class=\"docutils literal notranslate\"><span class=\"pre\">'make_published</span></code> i <code class=\"docutils literal notranslate\"><span class=\"pre\">actions</span></code> istället för en direkt funktionsreferens. Detta säger till <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> att leta upp åtgärden som en metod.</p>\n<p>Genom att definiera åtgärder som metoder får åtgärden en mer idiomatisk tillgång till själva <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a>, vilket gör att åtgärden kan anropa vilken som helst av de metoder som tillhandahålls av administratören.</p>\n<p id=\"custom-admin-action\">Vi kan t.ex. använda <code class=\"docutils literal notranslate\"><span class=\"pre\">self</span></code> för att skicka ett meddelande till användaren om att åtgärden var lyckad:</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=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">messages</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ngettext</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n        <span class=\"n\">updated</span> <span class=\"o\">=</span> <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">message_user</span><span class=\"p\">(</span>\n            <span class=\"n\">request</span><span class=\"p\">,</span>\n            <span class=\"n\">ngettext</span><span class=\"p\">(</span>\n                <span class=\"s2\">&quot;</span><span class=\"si\">%d</span><span class=\"s2\"> story was successfully marked as published.&quot;</span><span class=\"p\">,</span>\n                <span class=\"s2\">&quot;</span><span class=\"si\">%d</span><span class=\"s2\"> stories were successfully marked as published.&quot;</span><span class=\"p\">,</span>\n                <span class=\"n\">updated</span><span class=\"p\">,</span>\n            <span class=\"p\">)</span>\n            <span class=\"o\">%</span> <span class=\"n\">updated</span><span class=\"p\">,</span>\n            <span class=\"n\">messages</span><span class=\"o\">.</span><span class=\"n\">SUCCESS</span><span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n</code></pre></div>\n<p>This makes the action match what the admin itself does after successfully\nperforming an action:</p>\n<img alt=\"/sv/6.1/_images/actions-as-modeladmin-methods.png\" src=\"/sv/6.1/_images/actions-as-modeladmin-methods.png\" />\n</section>\n<section id=\"actions-that-provide-intermediate-pages\">\n<h3>Åtgärder som ger mellanliggande sidor<a class=\"heading-anchor\" href=\"#actions-that-provide-intermediate-pages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Som standard omdirigeras användaren tillbaka till den ursprungliga sidan i ändringslistan efter att en åtgärd har utförts. Vissa åtgärder, särskilt mer komplexa sådana, måste dock returnera mellanliggande sidor. Till exempel: ber den inbyggda åtgärden delete om bekräftelse innan de valda objekten raderas.</p>\n<p>För att tillhandahålla en mellanliggande sida, returnera en <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> (eller underklass) från din åtgärd. Du kan till exempel skriva en exportfunktion som använder Djangos <a class=\"reference internal\" href=\"/sv/6.1/topics/serialization/\"><span class=\"doc\">serialiseringsfunktioner</span></a> för att dumpa några utvalda objekt som JSON:</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=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">serializers</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">export_as_json</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">content_type</span><span class=\"o\">=</span><span class=\"s2\">&quot;application/json&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">serialize</span><span class=\"p\">(</span><span class=\"s2\">&quot;json&quot;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">,</span> <span class=\"n\">stream</span><span class=\"o\">=</span><span class=\"n\">response</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p>Generellt sett anses något som ovanstående inte vara en bra idé. För det mesta är den bästa metoden att returnera en <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpResponseRedirect\" title=\"django.http.HttpResponseRedirect\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponseRedirect</span></code></a> och omdirigera användaren till en vy som du har skrivit och skicka listan över valda objekt i GET-frågesträngen. Detta gör att du kan tillhandahålla komplex interaktionslogik på de mellanliggande sidorna. Om du till exempel vill tillhandahålla en mer komplett exportfunktion skulle du vilja låta användaren välja ett format och eventuellt en lista över fält som ska ingå i exporten. Det bästa du kan göra är att skriva en liten åtgärd som omdirigerar till din anpassade exportvy:</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=\"w\"> </span><span class=\"nn\">django.contrib.contenttypes.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ContentType</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponseRedirect</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">export_selected_objects</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">selected</span> <span class=\"o\">=</span> <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">,</span> <span class=\"n\">flat</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">ct</span> <span class=\"o\">=</span> <span class=\"n\">ContentType</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_for_model</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;/export/?ct=</span><span class=\"si\">%s</span><span class=\"s2\">&amp;ids=</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span>\n        <span class=\"o\">%</span> <span class=\"p\">(</span>\n            <span class=\"n\">ct</span><span class=\"o\">.</span><span class=\"n\">pk</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;,&quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">pk</span> <span class=\"ow\">in</span> <span class=\"n\">selected</span><span class=\"p\">),</span>\n        <span class=\"p\">)</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>Som du kan se är åtgärden ganska kort; all komplex logik hör hemma i din exportvy. Denna skulle behöva hantera objekt av alla typer, därav verksamheten med <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code>.</p>\n<p>Att skriva denna vy lämnas som en övning till läsaren.</p>\n</section>\n<section id=\"making-actions-available-site-wide\">\n<span id=\"adminsite-actions\"></span><h3>Göra åtgärder tillgängliga för hela webbplatsen<a class=\"heading-anchor\" href=\"#making-actions-available-site-wide\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.add_action\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AdminSite.</span></span><span class=\"sig-name descname\"><span class=\"pre\">add_action</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">action</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.add_action\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Some actions are best if they’re made available to <em>any</em> object in the\nadmin site – the export action defined above would be a good candidate.\nYou can make an action globally available using\n<a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.add_action\" title=\"django.contrib.admin.AdminSite.add_action\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">AdminSite.add_action()</span></code></a>. For example:</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=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">add_action</span><span class=\"p\">(</span><span class=\"n\">export_selected_objects</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>This makes the <code class=\"docutils literal notranslate\"><span class=\"pre\">export_selected_objects</span></code> action globally available as an\naction named ”export_selected_objects”. You can explicitly give the action\na name – good if you later want to programmatically <a class=\"reference internal\" href=\"#disabling-admin-actions\"><span class=\"std std-ref\">remove the\naction</span></a> – by passing a second argument to\n<a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.add_action\" title=\"django.contrib.admin.AdminSite.add_action\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">AdminSite.add_action()</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">add_action</span><span class=\"p\">(</span><span class=\"n\">export_selected_objects</span><span class=\"p\">,</span> <span class=\"s2\">&quot;export_selected&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"disabling-actions\">\n<span id=\"disabling-admin-actions\"></span><h3>Inaktivera åtgärder<a class=\"heading-anchor\" href=\"#disabling-actions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ibland behöver du inaktivera vissa åtgärder - särskilt de som <a class=\"reference internal\" href=\"#adminsite-actions\"><span class=\"std std-ref\">registered site-wide</span></a> - för vissa objekt. Det finns några olika sätt att inaktivera åtgärder:</p>\n<section id=\"disabling-a-site-wide-action\">\n<h4>Inaktivera en webbplatsomfattande åtgärd<a class=\"heading-anchor\" href=\"#disabling-a-site-wide-action\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.disable_action\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">AdminSite.</span></span><span class=\"sig-name descname\"><span class=\"pre\">disable_action</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.disable_action\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>If you need to disable a <a class=\"reference internal\" href=\"#adminsite-actions\"><span class=\"std std-ref\">site-wide action</span></a> you\ncan call <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.disable_action\" title=\"django.contrib.admin.AdminSite.disable_action\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">AdminSite.disable_action()</span></code></a>.</p>\n<p>Du kan t.ex. använda den här metoden för att ta bort den inbyggda åtgärden ”ta bort markerade objekt”:</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=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">disable_action</span><span class=\"p\">(</span><span class=\"s2\">&quot;delete_selected&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>När du har gjort ovanstående kommer den åtgärden inte längre att vara tillgänglig på hela webbplatsen.</p>\n<p>Om du däremot behöver återaktivera en globalt inaktiverad åtgärd för en viss modell, listar du den uttryckligen i listan <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin.actions</span></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=\"c1\"># Globally disable delete selected</span>\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">disable_action</span><span class=\"p\">(</span><span class=\"s2\">&quot;delete_selected&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"c1\"># This ModelAdmin will not have delete_selected available</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SomeModelAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;some_other_action&quot;</span><span class=\"p\">]</span>\n    <span class=\"o\">...</span>\n\n\n<span class=\"c1\"># This one will</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AnotherModelAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;delete_selected&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;a_third_action&quot;</span><span class=\"p\">]</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"disabling-all-actions-for-a-particular-modeladmin\">\n<h4>Inaktivera alla åtgärder för en viss <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a><a class=\"heading-anchor\" href=\"#disabling-all-actions-for-a-particular-modeladmin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Om du vill ha <em>inga</em> bulkåtgärder tillgängliga för en viss <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a>, sätt <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.actions\" title=\"django.contrib.admin.ModelAdmin.actions\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">ModelAdmin.actions</span></code></a> till <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n</code></pre></div>\n<p>Detta säger till <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> att inte visa eller tillåta några åtgärder, inklusive alla <a class=\"reference internal\" href=\"#adminsite-actions\"><span class=\"std std-ref\">site-wide actions</span></a>.</p>\n</section>\n<section id=\"conditionally-enabling-or-disabling-actions\">\n<h4>Villkorlig aktivering eller inaktivering av åtgärder<a class=\"heading-anchor\" href=\"#conditionally-enabling-or-disabling-actions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_actions\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">ModelAdmin.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_actions</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">action_location</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">ActionLocation.CHANGE_LIST</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_actions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Slutligen kan du villkorligt aktivera eller inaktivera åtgärder per begäran (och därmed per användare) genom att åsidosätta <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_actions\" title=\"django.contrib.admin.ModelAdmin.get_actions\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.get_actions()</span></code></a>.</p>\n<p>This returns a dictionary of actions allowed for the specific\n<code class=\"docutils literal notranslate\"><span class=\"pre\">action_location</span></code>. The keys are action names, and the values are\n<a class=\"reference internal\" href=\"#django.contrib.admin.Action\" title=\"django.contrib.admin.Action\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Action</span></code></a> objects.</p>\n<p>Om du t.ex. bara vill att användare vars namn börjar med ”J” ska kunna radera objekt i bulk:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_actions</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">action_location</span><span class=\"o\">=</span><span class=\"n\">ActionLocation</span><span class=\"o\">.</span><span class=\"n\">CHANGE_LIST</span><span class=\"p\">):</span>\n        <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_actions</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">action_location</span><span class=\"o\">=</span><span class=\"n\">action_location</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">username</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()</span> <span class=\"o\">!=</span> <span class=\"s2\">&quot;J&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">if</span> <span class=\"s2\">&quot;delete_selected&quot;</span> <span class=\"ow\">in</span> <span class=\"n\">actions</span><span class=\"p\">:</span>\n                <span class=\"k\">del</span> <span class=\"n\">actions</span><span class=\"p\">[</span><span class=\"s2\">&quot;delete_selected&quot;</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> <span class=\"n\">actions</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"6.1\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>The keyword argument <code class=\"docutils literal notranslate\"><span class=\"pre\">action_location</span></code> was added. The return type was\nchanged to a dictionary where the keys are action names and the values\nare <a class=\"reference internal\" href=\"#django.contrib.admin.Action\" title=\"django.contrib.admin.Action\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Action</span></code></a> objects, previously the values were\n<code class=\"docutils literal notranslate\"><span class=\"pre\">(function,</span> <span class=\"pre\">name,</span> <span class=\"pre\">description)</span></code> tuples.</p>\n</aside>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"setting-permissions-for-actions\">\n<span id=\"admin-action-permissions\"></span><h3>Ange behörigheter för åtgärder<a class=\"heading-anchor\" href=\"#setting-permissions-for-actions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Åtgärder kan begränsa sin tillgänglighet till användare med specifika behörigheter genom att omsluta åtgärdsfunktionen med <a class=\"reference internal\" href=\"#django.contrib.admin.action\" title=\"django.contrib.admin.action\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">action()</span></code></a>-dekoratorn och skicka argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">permissions</span></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=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span><span class=\"n\">permissions</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;change&quot;</span><span class=\"p\">])</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Åtgärden <code class=\"docutils literal notranslate\"><span class=\"pre\">make_published()</span></code> kommer endast att vara tillgänglig för användare som klarar <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_change_permission\" title=\"django.contrib.admin.ModelAdmin.has_change_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.has_change_permission()</span></code></a>-kontrollen.</p>\n<p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">permissions</span></code> har mer än en behörighet kommer åtgärden att vara tillgänglig så länge som användaren klarar minst en av kontrollerna.</p>\n<p>Tillgängliga värden för <code class=\"docutils literal notranslate\"><span class=\"pre\">permissions</span></code> och motsvarande metodkontroller är:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'add'</span></code>: <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_add_permission\" title=\"django.contrib.admin.ModelAdmin.has_add_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.has_add_permission()</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'change'</span></code>: <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_change_permission\" title=\"django.contrib.admin.ModelAdmin.has_change_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.has_change_permission()</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'delete'</span></code>: <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_delete_permission\" title=\"django.contrib.admin.ModelAdmin.has_delete_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.has_delete_permission()</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'view'</span></code>: <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_view_permission\" title=\"django.contrib.admin.ModelAdmin.has_view_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ModelAdmin.has_view_permission()</span></code></a></p></li>\n</ul>\n<p>Du kan ange vilket annat värde som helst så länge du implementerar en motsvarande <code class=\"docutils literal notranslate\"><span class=\"pre\">has_&lt;value&gt;_permission(self,</span> <span class=\"pre\">request)</span></code>-metod på <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code>.</p>\n<p>Till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_permission_codename</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">actions</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;make_published&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span><span class=\"n\">permissions</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;publish&quot;</span><span class=\"p\">])</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n        <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">has_publish_permission</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;Does the user have the publish permission?&quot;&quot;&quot;</span>\n        <span class=\"n\">opts</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">opts</span>\n        <span class=\"n\">codename</span> <span class=\"o\">=</span> <span class=\"n\">get_permission_codename</span><span class=\"p\">(</span><span class=\"s2\">&quot;publish&quot;</span><span class=\"p\">,</span> <span class=\"n\">opts</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">has_perm</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">.</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">opts</span><span class=\"o\">.</span><span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">codename</span><span class=\"p\">))</span>\n</code></pre></div>\n<section id=\"controlling-where-actions-are-available\">\n<span id=\"admin-action-availability\"></span><h4>Controlling where actions are available<a class=\"heading-anchor\" href=\"#controlling-where-actions-are-available\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<aside class=\"version-note version-added\" data-version=\"6.1\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<p>By default, admin actions are available on the change list page only. You can\ncontrol where an action appears using the <code class=\"docutils literal notranslate\"><span class=\"pre\">location</span></code> argument of the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&#64;admin.action</span></code> decorator.</p>\n<p>For example, to make an action available only on the change form, set\n<code class=\"docutils literal notranslate\"><span class=\"pre\">location</span></code> to <a class=\"reference internal\" href=\"#django.contrib.admin.ActionLocation.CHANGE_FORM\" title=\"django.contrib.admin.ActionLocation.CHANGE_FORM\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">ActionLocation.CHANGE_FORM</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.admin</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ActionLocation</span>\n\n\n<span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span><span class=\"n\">location</span><span class=\"o\">=</span><span class=\"n\">ActionLocation</span><span class=\"o\">.</span><span class=\"n\">CHANGE_FORM</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>To make an action available on both the change list and the change form:</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=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span>\n    <span class=\"n\">location</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">ActionLocation</span><span class=\"o\">.</span><span class=\"n\">CHANGE_FORM</span><span class=\"p\">,</span> <span class=\"n\">ActionLocation</span><span class=\"o\">.</span><span class=\"n\">CHANGE_LIST</span><span class=\"p\">],</span>\n    <span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;Publish&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">description_plural</span><span class=\"o\">=</span><span class=\"s2\">&quot;Mark selected stories as published&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"n\">modeladmin</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Notice that <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">description_plural</span></code> were provided. These are\noptional but the admin action will be labeled by <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> in the admin\nchange form and <code class=\"docutils literal notranslate\"><span class=\"pre\">description_plural</span></code> in the admin change list.</p>\n<p>You can customize how actions are rendered by overriding admin templates.\nThe change list page uses <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/actions.html</span></code> and the change form page uses\n<code class=\"docutils literal notranslate\"><span class=\"pre\">admin/change_form_actions.html</span></code>. Note that the change form template inherits\nfrom the change list actions template.</p>\n</section>\n</section>\n</section>\n<section id=\"the-action-decorator\">\n<h2>Dekoratorn ”action<a class=\"heading-anchor\" href=\"#the-action-decorator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.action\">\n<span class=\"sig-name descname\"><span class=\"pre\">action</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">permissions</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">description</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">description_plural</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">location</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">ActionLocation.CHANGE_LIST</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.action\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Denna dekorator kan användas för att ställa in specifika attribut på anpassade åtgärdsfunktioner som kan användas med <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.actions\" title=\"django.contrib.admin.ModelAdmin.actions\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">actions</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span><span class=\"p\">(</span>\n    <span class=\"n\">permissions</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;publish&quot;</span><span class=\"p\">],</span>\n    <span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;Mark selected stories as published&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Detta motsvarar att ange vissa attribut (med de ursprungliga, längre namnen) på funktionen direkt:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s2\">&quot;p&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"n\">make_published</span><span class=\"o\">.</span><span class=\"n\">allowed_permissions</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;publish&quot;</span><span class=\"p\">]</span>\n<span class=\"n\">make_published</span><span class=\"o\">.</span><span class=\"n\">short_description</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Mark selected stories as published&quot;</span>\n</code></pre></div>\n<p>Det är inte obligatoriskt att använda denna dekorator för att skapa en actionfunktion, men det kan vara användbart att använda den utan argument som en markör i källan för att identifiera syftet med funktionen:</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=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">action</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_inactive</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n    <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">is_active</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>I detta fall kommer det inte att lägga till några attribut till funktionen.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parametrar<span class=\"colon\">:</span></dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>permissions</strong> – A list of permission codenames that restrict the action\nto users who have at least one of the defined permissions. This sets\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">allowed_permissions</span></code> attribute on the function. See\n<a class=\"reference internal\" href=\"#admin-action-permissions\"><span class=\"std std-ref\">Ange behörigheter för åtgärder</span></a> for details.</p></li>\n<li><p><strong>description</strong> – A human-readable description of the action to be\nrendered in the admin. If <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> is not provided, Django\nrenders the function’s name, converting underscores to spaces and\ncapitalizing the first letter of the first word. This sets the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">short_description</span></code> attribute on the function.</p></li>\n<li><p><strong>description_plural</strong> – A human-readable description of the action used\nin contexts where plural wording is required, such as on the admin\nchange list. If <code class=\"docutils literal notranslate\"><span class=\"pre\">description_plural</span></code> is not provided, falls back to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code>. This sets the <code class=\"docutils literal notranslate\"><span class=\"pre\">plural_description</span></code> attribute on the\nfunction.</p></li>\n<li><p><strong>location</strong> – Specifies where the action is available. Accepts either a\nsingle <a class=\"reference internal\" href=\"#django.contrib.admin.ActionLocation\" title=\"django.contrib.admin.ActionLocation\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ActionLocation</span></code></a> value or an iterable of values. If\nomitted, the action is only available on the admin change list. See\n<a class=\"reference internal\" href=\"#admin-action-availability\"><span class=\"std std-ref\">Controlling where actions are available</span></a> for details.</p></li>\n</ul>\n</dd>\n</dl>\n<aside class=\"admonition-action-description-formatting-support admonition\">\n<p class=\"admonition-title\">Action description <code class=\"docutils literal notranslate\"><span class=\"pre\">%</span></code>-formatting support</p>\n<p>Action descriptions support <code class=\"docutils literal notranslate\"><span class=\"pre\">%</span></code>-formatting and may include\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'%(verbose_name)s'</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(verbose_name_plural)s'</span></code> placeholders.\nThese are replaced with the model’s\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/options/#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code></a> and\n<a class=\"reference internal\" href=\"/sv/6.1/ref/models/options/#django.db.models.Options.verbose_name_plural\" title=\"django.db.models.Options.verbose_name_plural\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">verbose_name_plural</span></code></a>.</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"6.1\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>The keyword arguments <code class=\"docutils literal notranslate\"><span class=\"pre\">description_plural</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">location</span></code> were\nadded.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"actionlocation\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">ActionLocation</span></code><a class=\"heading-anchor\" href=\"#actionlocation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"version-note version-added\" data-version=\"6.1\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ActionLocation\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">ActionLocation</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ActionLocation\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Enum of allowed values for the <code class=\"docutils literal notranslate\"><span class=\"pre\">location</span></code> parameter of the\n<a class=\"reference internal\" href=\"#django.contrib.admin.action\" title=\"django.contrib.admin.action\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">action()</span></code></a> decorator.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ActionLocation.CHANGE_FORM\">\n<span class=\"sig-name descname\"><span class=\"pre\">CHANGE_FORM</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ActionLocation.CHANGE_FORM\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The action is available on the admin change form. When an action is run,\nany unsaved changes on the admin change form will be lost.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ActionLocation.CHANGE_LIST\">\n<span class=\"sig-name descname\"><span class=\"pre\">CHANGE_LIST</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ActionLocation.CHANGE_LIST\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The action is available on the admin change list.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"action\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">Action</span></code><a class=\"heading-anchor\" href=\"#action\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"version-note version-added\" data-version=\"6.1\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.Action\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Action</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.Action\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Represents an action. Actions should be defined using the <a class=\"reference internal\" href=\"#django.contrib.admin.action\" title=\"django.contrib.admin.action\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">action()</span></code></a>\ndecorator.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.Action.func\">\n<span class=\"sig-name descname\"><span class=\"pre\">func</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.Action.func\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The action function. See <a class=\"reference internal\" href=\"#action-function\"><span class=\"std std-ref\">Skriva handlingsfunktioner</span></a> for details.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.Action.name\">\n<span class=\"sig-name descname\"><span class=\"pre\">name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.Action.name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The action function name.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.Action.description\">\n<span class=\"sig-name descname\"><span class=\"pre\">description</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.Action.description\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A human-readable description of the action to be rendered in the admin.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.Action.plural_description\">\n<span class=\"sig-name descname\"><span class=\"pre\">plural_description</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.Action.plural_description\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A human-readable description of the action used in contexts where\nplural wording is required.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.Action.locations\">\n<span class=\"sig-name descname\"><span class=\"pre\">locations</span></span><a class=\"heading-anchor\" href=\"#django.contrib.admin.Action.locations\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A list of <a class=\"reference internal\" href=\"#django.contrib.admin.ActionLocation\" title=\"django.contrib.admin.ActionLocation\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ActionLocation</span></code></a> values the admin action can be\nrendered.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>","rootId":"admin-actions","toc":[{"title":"Skriva åtgärder","anchor":"writing-actions","children":[{"title":"Skriva handlingsfunktioner","anchor":"writing-action-functions","children":[]},{"title":"Lägga till åtgärder till ModelAdmin","anchor":"adding-actions-to-the-modeladmin","children":[]},{"title":"Hantering av fel i åtgärder","anchor":"handling-errors-in-actions","children":[]}]},{"title":"Avancerade handlingstekniker","anchor":"advanced-action-techniques","children":[{"title":"Åtgärder som ModelAdmin-metoder","anchor":"actions-as-modeladmin-methods","children":[]},{"title":"Åtgärder som ger mellanliggande sidor","anchor":"actions-that-provide-intermediate-pages","children":[]},{"title":"Göra åtgärder tillgängliga för hela webbplatsen","anchor":"making-actions-available-site-wide","children":[]},{"title":"Inaktivera åtgärder","anchor":"disabling-actions","children":[{"title":"Inaktivera en webbplatsomfattande åtgärd","anchor":"disabling-a-site-wide-action","children":[]},{"title":"Inaktivera alla åtgärder för en viss ModelAdmin","anchor":"disabling-all-actions-for-a-particular-modeladmin","children":[]},{"title":"Villkorlig aktivering eller inaktivering av åtgärder","anchor":"conditionally-enabling-or-disabling-actions","children":[]}]},{"title":"Ange behörigheter för åtgärder","anchor":"setting-permissions-for-actions","children":[{"title":"Controlling where actions are available","anchor":"controlling-where-actions-are-available","children":[]}]}]},{"title":"Dekoratorn ”action","anchor":"the-action-decorator","children":[]},{"title":"ActionLocation","anchor":"actionlocation","children":[]},{"title":"Action","anchor":"action","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API-referens","url":"/sv/6.1/ref/"},{"docname":"ref/contrib/index","title":"contrib paket","url":"/sv/6.1/ref/contrib/"},{"docname":"ref/contrib/admin/index","title":"Django-administratörens webbplats","url":"/sv/6.1/ref/contrib/admin/"}],"prev":{"docname":"ref/contrib/admin/index","title":"Django-administratörens webbplats","url":"/sv/6.1/ref/contrib/admin/"},"next":{"docname":"ref/contrib/admin/filters","title":"ModelAdmin Lista Filter","url":"/sv/6.1/ref/contrib/admin/filters/"},"formats":{"html":"/sv/6.1/ref/contrib/admin/actions/","markdown":"/sv/6.1/ref/contrib/admin/actions.md","json":"/sv/6.1/ref/contrib/admin/actions.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/ref/contrib/admin/actions.txt","official":"https://docs.djangoproject.com/sv/6.1/ref/contrib/admin/actions/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}