{"title":"Skriva din första Django-app, del 7","version":"6.1","locale":"sv","docname":"intro/tutorial07","url":"/sv/6.1/intro/tutorial07/","canonical":"https://djangodocs.dev/sv/6.1/intro/tutorial07/","summary":"Denna handledning börjar där Tutorial 6 slutade. Vi fortsätter med web-poll applikationen och kommer att fokusera på att anpassa Djangos automatiskt genererade…","html":"<h1>Skriva din första Django-app, del 7<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-7\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Denna handledning börjar där <a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial06/\"><span class=\"doc\">Tutorial 6</span></a> slutade. Vi fortsätter med web-poll applikationen och kommer att fokusera på att anpassa Djangos automatiskt genererade admin-webbplats som vi först utforskade i <a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial02/\"><span class=\"doc\">Tutorial 2</span></a>.</p>\n<aside class=\"admonition-where-to-get-help admonition\">\n<p class=\"admonition-title\">Var du kan få hjälp:</p>\n<p>Om du har problem med att gå igenom den här handledningen kan du gå till avsnittet <a class=\"reference internal\" href=\"/sv/6.1/faq/help/\"><span class=\"doc\">Att få hjälp</span></a> i FAQ.</p>\n</aside>\n<section id=\"customize-the-admin-form\">\n<h2>Anpassa administratörsformuläret<a class=\"heading-anchor\" href=\"#customize-the-admin-form\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Genom att registrera modellen <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> med <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.register(Question)</span></code> kunde Django konstruera en standardformulärrepresentation. Ofta vill du anpassa hur adminformuläret ser ut och fungerar. Du gör detta genom att berätta för Django de alternativ du vill ha när du registrerar objektet.</p>\n<p>Låt oss se hur detta fungerar genom att omorganisera fälten i redigeringsformuläret. Ersätt raden <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.register(Question)</span></code> med:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</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\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;question_text&quot;</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\">Question</span><span class=\"p\">,</span> <span class=\"n\">QuestionAdmin</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Du följer det här mönstret - skapa en modelladministratörsklass och skicka den sedan som det andra argumentet till <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.register()</span></code> - varje gång du behöver ändra administratörsalternativen för en modell.</p>\n<p>Den här ändringen gör att ”Publiceringsdatum” kommer före fältet ”Fråga”:</p>\n<img alt=\"Fälten har omorganiserats\" src=\"/sv/6.1/_images/admin07.png\" />\n<p>Detta är inte imponerande med bara två fält, men för adminformulär med dussintals fält är det en viktig användbarhetsdetalj att välja en intuitiv ordning.</p>\n<p>Och på tal om formulär med dussintals fält kanske du vill dela upp formuläret i fältuppsättningar:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</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\">fieldsets</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">]}),</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;Date information&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">]}),</span>\n    <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\">Question</span><span class=\"p\">,</span> <span class=\"n\">QuestionAdmin</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Det första elementet i varje tupel i <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets\" title=\"django.contrib.admin.ModelAdmin.fieldsets\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">fieldsets</span></code></a> är titeln på fältuppsättningen. Så här ser vårt formulär ut nu:</p>\n<img alt=\"Formuläret har fält nu\" src=\"/sv/6.1/_images/admin08t.png\" />\n</section>\n<section id=\"adding-related-objects\">\n<h2>Lägga till relaterade objekt<a class=\"heading-anchor\" href=\"#adding-related-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Okej, vi har vår administratörssida för frågor, men en ”fråga” har flera ”val” och administratörssidan visar inte valen.</p>\n<p>Än så länge.</p>\n<p>Det finns två sätt att lösa detta problem. Det första är att registrera <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> hos administratören precis som vi gjorde med <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Choice</span><span class=\"p\">,</span> <span class=\"n\">Question</span>\n\n<span class=\"c1\"># ...</span>\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\">Choice</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Nu är ”Choices” ett tillgängligt alternativ i Django-admin. Formuläret ”Lägg till val” ser ut så här:</p>\n<img alt=\"Administratörssida för val\" src=\"/sv/6.1/_images/admin09.png\" />\n<p>I det formuläret är fältet ”Question” en valbox som innehåller alla frågor i databasen. Django vet att en <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> ska representeras i admin som en <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;select&gt;</span></code> box. I vårt fall finns det bara en fråga vid denna tidpunkt.</p>\n<p>Also note the ”Add another question” button (displayed as a plus sign) to the\nright of the ”Question” field. Every <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> relationship gets this\nbutton for free. When you click this button, you’ll get a popup window with the\n”Add question” form. If you add a question in that window and click ”Save”,\nDjango will save the question to the database and dynamically add it as the\nselected choice on the ”Add choice” form you’re looking at.</p>\n<p>Men egentligen är det här ett ineffektivt sätt att lägga till <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code>-objekt i systemet. Det vore bättre om du kunde lägga till ett gäng Choices direkt när du skapar <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>-objektet. Låt oss få det att hända.</p>\n<p>Ta bort anropet <code class=\"docutils literal notranslate\"><span class=\"pre\">register()</span></code> för modellen <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code>. Redigera sedan registreringskoden för <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> så att den lyder:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Choice</span><span class=\"p\">,</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChoiceInline</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">StackedInline</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Choice</span>\n    <span class=\"n\">extra</span> <span class=\"o\">=</span> <span class=\"mi\">3</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</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\">fieldsets</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">]}),</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;Date information&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">],</span> <span class=\"s2\">&quot;classes&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;collapse&quot;</span><span class=\"p\">]}),</span>\n    <span class=\"p\">]</span>\n    <span class=\"n\">inlines</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">ChoiceInline</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\">Question</span><span class=\"p\">,</span> <span class=\"n\">QuestionAdmin</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Detta säger till Django: ”Objekten <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> redigeras på administratörssidan för <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>. Som standard ska du tillhandahålla tillräckligt med fält för 3 val.”</p>\n<p>Ladda sidan ”Lägg till fråga” för att se hur det ser ut:</p>\n<img alt=\"Lägg till fråga-sidan har nu val på den\" src=\"/sv/6.1/_images/admin10t.png\" />\n<p>Det fungerar på följande sätt: Det finns tre platser för relaterade Choices - som anges med <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> - och varje gång du kommer tillbaka till sidan ”Change” för ett redan skapat objekt får du ytterligare tre extra platser.</p>\n<p>At the end of the three current slots you will find an ”Add another Choice”\nlink. If you click on it, a new slot will be added. If you want to remove the\nadded slot, you can click on the X to the top right of the added slot. This\nimage shows an added slot:</p>\n<img alt=\"Ytterligare slot läggs till dynamiskt\" src=\"/sv/6.1/_images/admin14t.png\" />\n<p>Ett litet problem, dock. Det tar mycket skärmutrymme att visa alla fält för att ange relaterade <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code>-objekt. Av den anledningen erbjuder Django ett tabulärt sätt att visa inline relaterade objekt. För att använda det, ändra <code class=\"docutils literal notranslate\"><span class=\"pre\">ChoiceInline</span></code> deklarationen till att läsa:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChoiceInline</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">TabularInline</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></figure>\n<p>Med denna <code class=\"docutils literal notranslate\"><span class=\"pre\">TabularInline</span></code> (istället för <code class=\"docutils literal notranslate\"><span class=\"pre\">StackedInline</span></code>) visas de relaterade objekten i ett mer kompakt, tabellbaserat format:</p>\n<img alt=\"Sidan Lägg till fråga har nu fler kompakta val\" src=\"/sv/6.1/_images/admin11t.png\" />\n<p>Observera att det finns en extra ”Delete?”-kolumn som gör det möjligt att ta bort rader som lagts till med knappen ”Add another Choice” och rader som redan har sparats.</p>\n</section>\n<section id=\"customize-the-admin-change-list\">\n<h2>Anpassa ändringslistan för administratörer<a class=\"heading-anchor\" href=\"#customize-the-admin-change-list\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Nu när administratörssidan för frågor ser bra ut ska vi göra några justeringar på sidan ”ändringslista” - den sida som visar alla frågor i systemet.</p>\n<p>Så här ser det ut i nuläget:</p>\n<img alt=\"Omröstningar ändrar listsida\" src=\"/sv/6.1/_images/admin04t.png\" />\n<p>Som standard visar Django <code class=\"docutils literal notranslate\"><span class=\"pre\">str()</span></code> för varje objekt. Men ibland skulle det vara till större hjälp om vi kunde visa enskilda fält. För att göra det använder du adminalternativet <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>, som är en lista med fältnamn som ska visas, som kolumner, på sidan med ändringslistan för objektet:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</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=\"c1\"># ...</span>\n    <span class=\"n\">list_display</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">]</span>\n</code></pre></figure>\n<p>För säkerhets skull inkluderar vi även metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">was_published_recently()</span></code> från <a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial02/\"><span class=\"doc\">Tutorial 2</span></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</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=\"c1\"># ...</span>\n    <span class=\"n\">list_display</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;was_published_recently&quot;</span><span class=\"p\">]</span>\n</code></pre></figure>\n<p>Nu ser sidan med frågeändringslistan ut så här:</p>\n<img alt=\"Omröstningar ändrar listsida, uppdaterad\" src=\"/sv/6.1/_images/admin12t.png\" />\n<p>Du kan klicka på kolumnrubrikerna för att sortera efter dessa värden - utom när det gäller rubriken <code class=\"docutils literal notranslate\"><span class=\"pre\">was_published_recently</span></code>, eftersom det inte finns stöd för sortering efter resultatet av en godtycklig metod. Observera också att kolumnrubriken för <code class=\"docutils literal notranslate\"><span class=\"pre\">was_published_recently</span></code> som standard är namnet på metoden (med understreck ersatta med mellanslag), och att varje rad innehåller strängrepresentationen av utdata.</p>\n<p>Du kan förbättra det genom att använda <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 på den metoden (utöka <code class=\"file docutils literal notranslate\"><span class=\"pre\">polls/models.py</span></code>-filen som skapades i <a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial02/\"><span class=\"doc\">Tutorial 2</span></a>), enligt följande:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/modeller.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Question</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=\"c1\"># ...</span>\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">display</span><span class=\"p\">(</span>\n        <span class=\"n\">boolean</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"n\">ordering</span><span class=\"o\">=</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;Published recently?&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">was_published_recently</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">now</span> <span class=\"o\">=</span> <span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"n\">now</span> <span class=\"o\">-</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">&lt;=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pub_date</span> <span class=\"o\">&lt;=</span> <span class=\"n\">now</span>\n</code></pre></figure>\n<p>För mer information om de egenskaper som kan konfigureras via dekoratorn, se <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>.</p>\n<p>Redigera filen <code class=\"file docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code> igen och lägg till en förbättring av sidan med ändringslistan <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>: filter med hjälp av <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter\" title=\"django.contrib.admin.ModelAdmin.list_filter\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_filter</span></code></a>. Lägg till följande rad i <code class=\"docutils literal notranslate\"><span class=\"pre\">QuestionAdmin</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=\"n\">list_filter</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Det lägger till en ”Filter”-sidofält som låter människor filtrera ändringslistan efter fältet <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code>:</p>\n<img alt=\"Omröstningar ändrar listsida, uppdaterad\" src=\"/sv/6.1/_images/admin13t.png\" />\n<p>Vilken typ av filter som visas beror på vilken typ av fält du filtrerar på. Eftersom <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> är en <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a>, vet Django att ge lämpliga filteralternativ: ”Vilket datum som helst”, ”Idag”, ”De senaste 7 dagarna”, ”Den här månaden”, ”Det här året”.</p>\n<p>Det här ser bra ut. Låt oss lägga till lite sökfunktionalitet:</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\">search_fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Det lägger till en sökruta längst upp i ändringslistan. När någon skriver in söktermer kommer Django att söka i fältet <code class=\"docutils literal notranslate\"><span class=\"pre\">question_text</span></code>. Du kan använda så många fält som du vill - men eftersom det använder en <code class=\"docutils literal notranslate\"><span class=\"pre\">LIKE</span></code>-fråga bakom kulisserna, kommer det att göra det lättare för din databas att göra sökningen genom att begränsa antalet sökfält till ett rimligt antal.</p>\n<p>Now’s also a good time to note that change lists give you free pagination. The\ndefault is to display 100 items per page.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Se även</p>\n<p>The following <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> options allow\nfurther customization of change lists:\n<a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_per_page\" title=\"django.contrib.admin.ModelAdmin.list_per_page\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_per_page</span></code></a>,\n<a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields\" title=\"django.contrib.admin.ModelAdmin.search_fields\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">search_fields</span></code></a>,\n<a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.date_hierarchy\" title=\"django.contrib.admin.ModelAdmin.date_hierarchy\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">date_hierarchy</span></code></a>, and\n<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>.</p>\n</aside>\n</section>\n<section id=\"customize-the-admin-look-and-feel\">\n<h2>Anpassa administratörens utseende och känsla<a class=\"heading-anchor\" href=\"#customize-the-admin-look-and-feel\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Det är uppenbart att det är löjligt att ha ”Django administration” högst upp på varje adminsida. Det är bara platshållartext.</p>\n<p>Du kan dock ändra det med hjälp av Djangos mallsystem. Django-admin drivs av Django själv och dess gränssnitt använder Djangos eget mallsystem.</p>\n<section id=\"customizing-your-project-s-templates\">\n<span id=\"ref-customizing-your-projects-templates\"></span><h3>Anpassa mallarna för ditt <em>projekt</em><a class=\"heading-anchor\" href=\"#customizing-your-project-s-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Skapa en <code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code> katalog i din <code class=\"docutils literal notranslate\"><span class=\"pre\">djangotutorial</span></code> katalog. Mallar kan finnas var som helst på ditt filsystem som Django kan komma åt. (Django körs som vilken användare som helst som din server kör.) Att hålla dina mallar inom projektet är dock en bra konvention att följa.</p>\n<p>Öppna din inställningsfil (<code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code>, kom ihåg) och lägg till ett <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> alternativ i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a> inställningen:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">TEMPLATES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.template.backends.django.DjangoTemplates&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;DIRS&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">BASE_DIR</span> <span class=\"o\">/</span> <span class=\"s2\">&quot;templates&quot;</span><span class=\"p\">],</span>\n        <span class=\"s2\">&quot;APP_DIRS&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;context_processors&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n                <span class=\"s2\">&quot;django.template.context_processors.request&quot;</span><span class=\"p\">,</span>\n                <span class=\"s2\">&quot;django.contrib.auth.context_processors.auth&quot;</span><span class=\"p\">,</span>\n                <span class=\"s2\">&quot;django.contrib.messages.context_processors.messages&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p><a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> är en lista över filsystemkataloger som ska kontrolleras när Django-mallar laddas; det är en sökväg.</p>\n<aside class=\"admonition-organizing-templates admonition\">\n<p class=\"admonition-title\">Organisera mallar</p>\n<p>Precis som med de statiska filerna skulle vi <em>kunna</em> ha alla våra mallar samlade i en enda stor mallkatalog, och det skulle fungera alldeles utmärkt. Mallar som tillhör en viss applikation bör dock placeras i den applikationens mallkatalog (t.ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates</span></code>) snarare än i projektets (<code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code>). Vi kommer att diskutera mer i detalj i <a class=\"reference internal\" href=\"/sv/6.1/intro/reusable-apps/\"><span class=\"doc\">återanvändbara apps handledning</span></a> <em>varför</em> vi gör detta.</p>\n</aside>\n<p>Skapa nu en katalog som heter <code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code> inuti <code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code>, och kopiera mallen <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/base_site.html</span></code> från standardkatalogen för Djangos adminmallar i källkoden för Django själv (<a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/contrib/admin/templates\">django/contrib/admin/templates</a>) till den katalogen.</p>\n<aside class=\"admonition-where-are-the-django-source-files admonition\">\n<p class=\"admonition-title\">Var finns Djangos källfiler?</p>\n<p>Om du har svårt att hitta var Djangos källfiler finns på ditt system kör du följande kommando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>-c<span class=\"w\"> </span><span class=\"s2\">&quot;import django; print(django.__path__)&quot;</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -c <span class=\"s2\">&quot;import django; print(django.__path__)&quot;</span>\n</code></pre></div></div></div>\n</aside>\n<p>Redigera sedan filen och ersätt <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site_header|default:_('Django</span> <span class=\"pre\">administration')</span> <span class=\"pre\">}}</span></code> (inklusive hakparenteserna) med namnet på din egen webbplats som du tycker passar. Du bör sluta med ett avsnitt av kod som:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">branding</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;site-name&quot;</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;admin:index&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>Polls Administration<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">user.is_anonymous</span> <span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span> <span class=\"k\">include</span> <span class=\"s2\">&quot;admin/color_theme_toggle.html&quot;</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Vi använder detta tillvägagångssätt för att lära dig hur du kan åsidosätta mallar. I ett verkligt projekt skulle du förmodligen använda attributet <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#django.contrib.admin.AdminSite.site_header\" title=\"django.contrib.admin.AdminSite.site_header\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">django.contrib.admin.AdminSite.site_header</span></code></a> för att lättare göra just den här anpassningen.</p>\n<p>Den här mallfilen innehåller mycket text som <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">branding</span> <span class=\"pre\">%}</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">title</span> <span class=\"pre\">}}</span></code>. Taggarna <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span></code> är en del av Djangos mallspråk. När Django renderar <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/base_site.html</span></code>, kommer detta mallspråk att utvärderas för att producera den slutliga HTML-sidan, precis som vi såg i <a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a>.</p>\n<p>Observera att alla Djangos standardmallar för administratörer kan åsidosättas. För att åsidosätta en mall gör du samma sak som du gjorde med <code class=\"docutils literal notranslate\"><span class=\"pre\">base_site.html</span></code> - kopiera den från standardkatalogen till din anpassade katalog och gör ändringar.</p>\n</section>\n<section id=\"customizing-your-application-s-templates\">\n<h3>Anpassa mallarna för din <em>applikation</em><a class=\"heading-anchor\" href=\"#customizing-your-application-s-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Smarta läsare kommer att fråga: Men om <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> var tom som standard, hur hittade Django standardmallarna för admin? Svaret är att, eftersom <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APP_DIRS</span></code></a> är inställd på <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, letar Django automatiskt efter en <code class=\"docutils literal notranslate\"><span class=\"pre\">templates/</span></code> underkatalog inom varje applikationspaket, för användning som en fallback (glöm inte att <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.admin</span></code> är en applikation).</p>\n<p>Vår poll-applikation är inte särskilt komplex och behöver inte anpassade admin-mallar. Men om det blir mer sofistikerat och kräver modifiering av Djangos standardadministratörsmallar för vissa av dess funktioner, skulle det vara mer förnuftigt att modifiera <em>applikationens</em> mallar, snarare än de i <em>projektet</em>. På så sätt kan du inkludera pollsapplikationen i alla nya projekt och vara säker på att den hittar de anpassade mallar den behöver.</p>\n<p>Se <a class=\"reference internal\" href=\"/sv/6.1/topics/templates/#template-loading\"><span class=\"std std-ref\">dokumentation för laddning av mallar</span></a> för mer information om hur Django hittar sina mallar.</p>\n</section>\n</section>\n<section id=\"customize-the-admin-index-page\">\n<h2>Anpassa indexsidan för administratörer<a class=\"heading-anchor\" href=\"#customize-the-admin-index-page\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>På ett liknande sätt kanske du vill anpassa utseendet på Django-administratörens indexsida.</p>\n<p>Som standard visas alla appar i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> som har registrerats i adminprogrammet i alfabetisk ordning. Du kanske vill göra betydande ändringar i layouten. När allt kommer omkring är indexet förmodligen den viktigaste sidan i admin, och den bör vara lätt att använda.</p>\n<p>The template to customize is <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/index.html</span></code>. (Do the same as with\n<code class=\"docutils literal notranslate\"><span class=\"pre\">admin/base_site.html</span></code> in the previous section – copy it from the default\ndirectory to your custom template directory). Edit the file, and you’ll see it\nuses a template variable called <code class=\"docutils literal notranslate\"><span class=\"pre\">app_list</span></code>. That variable contains every\ninstalled Django app. Instead of using that, you can hardcode links to\nobject-specific admin pages in whatever way you think is best.</p>\n<p>När du känner dig bekväm med administratören kan du läsa <a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial08/\"><span class=\"doc\">del 8 av denna handledning</span></a> för att lära dig hur du använder tredjepartspaket.</p>\n</section>","rootId":"writing-your-first-django-app-part-7","toc":[{"title":"Anpassa administratörsformuläret","anchor":"customize-the-admin-form","children":[]},{"title":"Lägga till relaterade objekt","anchor":"adding-related-objects","children":[]},{"title":"Anpassa ändringslistan för administratörer","anchor":"customize-the-admin-change-list","children":[]},{"title":"Anpassa administratörens utseende och känsla","anchor":"customize-the-admin-look-and-feel","children":[{"title":"Anpassa mallarna för ditt projekt","anchor":"customizing-your-project-s-templates","children":[]},{"title":"Anpassa mallarna för din applikation","anchor":"customizing-your-application-s-templates","children":[]}]},{"title":"Anpassa indexsidan för administratörer","anchor":"customize-the-admin-index-page","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Kom igång","url":"/sv/6.1/intro/"}],"prev":{"docname":"intro/tutorial06","title":"Skriva din första Django-app, del 6","url":"/sv/6.1/intro/tutorial06/"},"next":{"docname":"intro/tutorial08","title":"Skriva din första Django-app, del 8","url":"/sv/6.1/intro/tutorial08/"},"formats":{"html":"/sv/6.1/intro/tutorial07/","markdown":"/sv/6.1/intro/tutorial07.md","json":"/sv/6.1/intro/tutorial07.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/intro/tutorial07.txt","official":"https://docs.djangoproject.com/sv/6.1/intro/tutorial07/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}