{"title":"Skriva din första Django-app, del 7","version":"5.2","locale":"sv","docname":"intro/tutorial07","url":"/sv/5.2/intro/tutorial07/","canonical":"https://djangodocs.dev/sv/5.2/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…","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/5.2/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/5.2/intro/tutorial02/\"><span class=\"doc\">Tutorial 2</span></a>.</p>\n<aside class=\"admonition-where-to-get-help admonition\" role=\"note\">\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/5.2/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\">Question</code> med <code class=\"docutils literal notranslate\">admin.site.register(Question)</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\">admin.site.register(Question)</code> med:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/admin.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Question\n\n\n<span class=\"k\">class</span> <span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    fields <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\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Question<span class=\"p\">,</span> QuestionAdmin<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\">admin.site.register()</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/5.2/_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\">polls/admin.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Question\n\n\n<span class=\"k\">class</span> <span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    fieldsets <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\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Question<span class=\"p\">,</span> QuestionAdmin<span class=\"p\">)</span>\n</code></pre></figure>\n<p>Det första elementet i varje tupel i <a class=\"reference internal\" href=\"/sv/5.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets\" title=\"django.contrib.admin.ModelAdmin.fieldsets\"><code class=\"xref py py-attr docutils literal notranslate\">fieldsets</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/5.2/_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\">Choice</code> hos administratören precis som vi gjorde med <code class=\"docutils literal notranslate\">Question</code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">polls/admin.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Choice<span class=\"p\">,</span> Question\n\n<span class=\"c1\"># ...</span>\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Choice<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/5.2/_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/5.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> ska representeras i admin som en <code class=\"docutils literal notranslate\">&lt;select&gt;</code> box. I vårt fall finns det bara en fråga vid denna tidpunkt.</p>\n<p>Notera också länken ”Lägg till en annan fråga” bredvid ”Fråga” Varje objekt med en <code class=\"docutils literal notranslate\">ForeignKey</code>-relation till ett annat får detta gratis. När du klickar på ”Add another question” öppnas ett popup-fönster med formuläret ”Add question”. Om du lägger till en fråga i det fönstret och klickar på ”Spara” kommer Django att spara frågan i databasen och dynamiskt lägga till den som det valda valet i formuläret ”Lägg till val” som du tittar på.</p>\n<p>Men egentligen är det här ett ineffektivt sätt att lägga till <code class=\"docutils literal notranslate\">Choice</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\">Question</code>-objektet. Låt oss få det att hända.</p>\n<p>Ta bort anropet <code class=\"docutils literal notranslate\">register()</code> för modellen <code class=\"docutils literal notranslate\">Choice</code>. Redigera sedan registreringskoden för <code class=\"docutils literal notranslate\">Question</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\">polls/admin.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Choice<span class=\"p\">,</span> Question\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ChoiceInline</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>StackedInline<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Choice\n    extra <span class=\"o\">=</span> <span class=\"mi\">3</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    fieldsets <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    inlines <span class=\"o\">=</span> <span class=\"p\">[</span>ChoiceInline<span class=\"p\">]</span>\n\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Question<span class=\"p\">,</span> QuestionAdmin<span class=\"p\">)</span>\n</code></pre></figure>\n<p>Detta säger till Django: ”Objekten <code class=\"docutils literal notranslate\">Choice</code> redigeras på administratörssidan för <code class=\"docutils literal notranslate\">Question</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/5.2/_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\">extra</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>I slutet av de tre aktuella platserna hittar du en länk ”Lägg till ett annat val”.  Om du klickar på den kommer en ny slot att läggas till. Om du vill ta bort den tillagda platsen kan du klicka på X:et längst upp till höger om den tillagda platsen. Den här bilden visar en tillagd slot:</p>\n<img alt=\"Ytterligare slot läggs till dynamiskt\" src=\"/sv/5.2/_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\">Choice</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\">ChoiceInline</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\">polls/admin.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span> <span class=\"nc\">ChoiceInline</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>TabularInline<span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></figure>\n<p>Med denna <code class=\"docutils literal notranslate\">TabularInline</code> (istället för <code class=\"docutils literal notranslate\">StackedInline</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/5.2/_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/5.2/_images/admin04t.png\" />\n<p>Som standard visar Django <code class=\"docutils literal notranslate\">str()</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/5.2/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\">list_display</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\">polls/admin.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span> <span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    list_display <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\">was_published_recently()</code> från <a class=\"reference internal\" href=\"/sv/5.2/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\">polls/admin.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span> <span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    list_display <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/5.2/_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\">was_published_recently</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\">was_published_recently</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/5.2/ref/contrib/admin/#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\">display()</code></a>-dekoratorn på den metoden (utöka <code class=\"file docutils literal notranslate\">polls/models.py</code>-filen som skapades i <a class=\"reference internal\" href=\"/sv/5.2/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\">polls/modeller.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Question</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>\n        boolean<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        ordering<span class=\"o\">=</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span>\n        description<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=\"nf\">was_published_recently</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        now <span class=\"o\">=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span>\n        <span class=\"k\">return</span> now <span class=\"o\">-</span> datetime<span class=\"o\">.</span>timedelta<span class=\"p\">(</span>days<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>pub_date <span class=\"o\">&lt;=</span> now\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/5.2/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\">list_display</code></a>.</p>\n<p>Redigera filen <code class=\"file docutils literal notranslate\">polls/admin.py</code> igen och lägg till en förbättring av sidan med ändringslistan <code class=\"docutils literal notranslate\">Question</code>: filter med hjälp av <a class=\"reference internal\" href=\"/sv/5.2/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\">list_filter</code></a>. Lägg till följande rad i <code class=\"docutils literal notranslate\">QuestionAdmin</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>list_filter <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\">pub_date</code>:</p>\n<img alt=\"Omröstningar ändrar listsida, uppdaterad\" src=\"/sv/5.2/_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\">pub_date</code> är en <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</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>search_fields <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\">question_text</code>. Du kan använda så många fält som du vill - men eftersom det använder en <code class=\"docutils literal notranslate\">LIKE</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>Nu är det också en bra tid att notera att ändringslistor ger dig gratis paginering. Standard är att visa 100 objekt per sida. <a class=\"reference internal\" href=\"/sv/5.2/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\">Change list pagination</code></a>, <a class=\"reference internal\" href=\"/sv/5.2/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\">search boxes</code></a>, <a class=\"reference internal\" href=\"/sv/5.2/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\">filters</code></a>, <a class=\"reference internal\" href=\"/sv/5.2/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\">date-hierarchies</code></a>, och <a class=\"reference internal\" href=\"/sv/5.2/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\">column-header-ordering</code></a> fungerar alla tillsammans som du tror att de ska.</p>\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\">templates</code> katalog i din <code class=\"docutils literal notranslate\">djangotutorial</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\">mysite/settings.py</code>, kom ihåg) och lägg till ett <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\">DIRS</code></a> alternativ i <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\">TEMPLATES</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\">mysite/settings.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code>TEMPLATES <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>BASE_DIR <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/5.2/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\">DIRS</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\" role=\"note\">\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\">polls/templates</code>) snarare än i projektets (<code class=\"docutils literal notranslate\">templates</code>). Vi kommer att diskutera mer i detalj i <a class=\"reference internal\" href=\"/sv/5.2/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\">admin</code> inuti <code class=\"docutils literal notranslate\">templates</code>, och kopiera mallen <code class=\"docutils literal notranslate\">admin/base_site.html</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/5.2.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\" role=\"note\">\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 -c <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\">{{ site_header|default:_('Django administration') }}</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/5.2/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\">django.contrib.admin.AdminSite.site_header</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\">{% block branding %}</code> och <code class=\"docutils literal notranslate\">{{ title }}</code>. Taggarna <code class=\"docutils literal notranslate\">{%</code> och <code class=\"docutils literal notranslate\">{{</code> är en del av Djangos mallspråk. När Django renderar <code class=\"docutils literal notranslate\">admin/base_site.html</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/5.2/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\">base_site.html</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/5.2/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\">DIRS</code></a> var tom som standard, hur hittade Django standardmallarna för admin? Svaret är att, eftersom <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\">APP_DIRS</code></a> är inställd på <code class=\"docutils literal notranslate\">True</code>, letar Django automatiskt efter en <code class=\"docutils literal notranslate\">templates/</code> underkatalog inom varje applikationspaket, för användning som en fallback (glöm inte att <code class=\"docutils literal notranslate\">django.contrib.admin</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/5.2/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/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</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>Den mall som ska anpassas är <code class=\"docutils literal notranslate\">admin/index.html</code>. (Gör samma sak som med <code class=\"docutils literal notranslate\">admin/base_site.html</code> i föregående avsnitt - kopiera den från standardkatalogen till din anpassade mallkatalog). Redigera filen och du kommer att se att den använder en mallvariabel som heter <code class=\"docutils literal notranslate\">app_list</code>. Den variabeln innehåller alla installerade Django-appar. Istället för att använda den kan du hårdkoda länkar till objektspecifika adminsidor på det sätt som du tycker är bäst.</p>\n<p>När du känner dig bekväm med administratören kan du läsa <a class=\"reference internal\" href=\"/sv/5.2/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/5.2/intro/"}],"prev":{"docname":"intro/tutorial06","title":"Skriva din första Django-app, del 6","url":"/sv/5.2/intro/tutorial06/"},"next":{"docname":"intro/tutorial08","title":"Skriva din första Django-app, del 8","url":"/sv/5.2/intro/tutorial08/"},"formats":{"html":"/sv/5.2/intro/tutorial07/","markdown":"/sv/5.2/intro/tutorial07.md","json":"/sv/5.2/intro/tutorial07.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/intro/tutorial07.txt","official":"https://docs.djangoproject.com/sv/5.2/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"]}