{"title":"Skriva din första Django-app, del 2","version":"6.1","locale":"sv","docname":"intro/tutorial02","url":"/sv/6.1/intro/tutorial02/","canonical":"https://djangodocs.dev/sv/6.1/intro/tutorial02/","summary":"Denna tutorial börjar där Tutorial 1 slutade. Vi ställer in databasen, skapar din första modell och får en snabb introduktion till Djangos automatiskt…","html":"<h1>Skriva din första Django-app, del 2<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-2\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Denna tutorial börjar där <a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial01/\"><span class=\"doc\">Tutorial 1</span></a> slutade. Vi ställer in databasen, skapar din första modell och får en snabb introduktion till Djangos automatiskt genererade administratörssida.</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/6.1/faq/help/\"><span class=\"doc\">Att få hjälp</span></a> i FAQ.</p>\n</aside>\n<section id=\"database-setup\">\n<h2>Uppsättning av databas<a class=\"heading-anchor\" href=\"#database-setup\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Öppna nu <code class=\"file docutils literal notranslate\">mysite/settings.py</code>. Det är en vanlig Python-modul med variabler på modulnivå som representerar Django-inställningar.</p>\n<p>Som standard använder konfigurationen <code class=\"xref std std-setting docutils literal notranslate\">DATABASER</code> SQLite. Om du är nybörjare på databaser, eller bara är intresserad av att prova Django, är detta det enklaste valet. SQLite ingår i Python, så du behöver inte installera något annat för att stödja din databas. När du startar ditt första riktiga projekt kanske du dock vill använda en mer skalbar databas som PostgreSQL för att undvika huvudvärk för databasbyte längs vägen.</p>\n<p>Om du vill använda en annan databas, se <a class=\"reference internal\" href=\"/sv/6.1/topics/install/#database-installation\"><span class=\"std std-ref\">detaljer för att anpassa och få igång din databas</span></a>.</p>\n<p>Medan du redigerar <code class=\"file docutils literal notranslate\">mysite/settings.py</code>, ställ in <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_ZONE</code></a> till din tidszon.</p>\n<p>Lägg också märke till <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> högst upp i filen. Den innehåller namnen på alla Django-applikationer som är aktiverade i den här Django-instansen. Appar kan användas i flera projekt, och du kan paketera och distribuera dem för användning av andra i deras projekt.</p>\n<p>Som standard innehåller <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> följande appar, som alla levereras med Django:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/admin/#module-django.contrib.admin\" title=\"django.contrib.admin: Django's admin site.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.admin</code></a> – Administrationssidan. Du kommer att använda den inom kort.</p></li>\n<li><p><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\">django.contrib.auth</code></a> – Ett system för autentisering.</p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/contenttypes/#module-django.contrib.contenttypes\" title=\"django.contrib.contenttypes: Provides generic interface to installed models.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.contenttypes</code></a> – Ett ramverk för innehållstyper.</p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/6.1/topics/http/sessions/#module-django.contrib.sessions\" title=\"django.contrib.sessions: Provides session management for Django projects.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.sessions</code></a> – Ett ramverk för sessioner.</p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/messages/#module-django.contrib.messages\" title=\"django.contrib.messages: Provides cookie- and session-based temporary message storage.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.messages</code></a> – Ett ramverk för meddelanden.</p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/staticfiles/#module-django.contrib.staticfiles\" title=\"django.contrib.staticfiles: An app for handling static files.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.staticfiles</code></a> – Ett ramverk för hantering av statiska filer.</p></li>\n</ul>\n<p>Dessa applikationer ingår som standard som en bekvämlighet för det vanliga fallet.</p>\n<p>Vissa av dessa program använder dock minst en databastabell, så vi måste skapa tabellerna i databasen innan vi kan använda dem. Det gör du genom att köra 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 manage.py migrate\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 manage.py migrate\n</code></pre></div></div></div>\n<p>Kommandot <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> tittar på inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> och skapar alla nödvändiga databastabeller enligt databasinställningarna i filen <code class=\"file docutils literal notranslate\">mysite/settings.py</code> och de databasmigreringar som levereras med appen (vi går igenom dem senare). Du kommer att se ett meddelande för varje migrering som den tillämpar. Om du är intresserad kan du köra kommandoradsklienten för din databas och skriva <code class=\"docutils literal notranslate\">dt</code> (PostgreSQL), <code class=\"docutils literal notranslate\">SHOW TABLES;</code> (MariaDB, MySQL), <code class=\"docutils literal notranslate\">.tables</code> (SQLite) eller <code class=\"docutils literal notranslate\">SELECT TABLE_NAME FROM USER_TABLES;</code> (Oracle) för att visa de tabeller som Django skapade.</p>\n<aside class=\"admonition-for-the-minimalists admonition\" role=\"note\">\n<p class=\"admonition-title\">För minimalisterna</p>\n<p>Som vi sa ovan ingår standardapplikationerna för det vanliga fallet, men alla behöver dem inte. Om du inte behöver någon eller alla av dem kan du kommentera ut eller ta bort lämpliga rader från <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> innan du kör <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a>. Kommandot <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> kommer endast att köra migreringar för 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\">INSTALLED_APPS</code></a>.</p>\n</aside>\n</section>\n<section id=\"creating-models\">\n<span id=\"id1\"></span><h2>Skapa modeller<a class=\"heading-anchor\" href=\"#creating-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Nu ska vi definiera dina modeller - i princip din databaslayout, med ytterligare metadata.</p>\n<aside class=\"admonition-philosophy admonition\" role=\"note\">\n<p class=\"admonition-title\">Filosofi</p>\n<p>En modell är den enda, definitiva källan till information om dina data. Den innehåller de viktigaste fälten och beteendena för de data du lagrar. Django följer <a class=\"reference internal\" href=\"/sv/6.1/misc/design-philosophies/#dry\"><span class=\"std std-ref\">DRY-principen</span></a>. Målet är att definiera din datamodell på ett ställe och automatiskt härleda saker från den.</p>\n<p>Detta omfattar migreringarna, som härleds från modellfilen. De utgör en historik som Django använder för att uppdatera databasens schema så att det stämmer med dina aktuella modeller.</p>\n</aside>\n<p>I vår poll-app skapar vi två modeller: <code class=\"docutils literal notranslate\">Question</code> och <code class=\"docutils literal notranslate\">Choice</code>. En <code class=\"docutils literal notranslate\">Question</code> har en fråga och ett publiceringsdatum. En <code class=\"docutils literal notranslate\">Choice</code> har två fält: texten i valet och en rösträkning. Varje <code class=\"docutils literal notranslate\">Choice</code> är associerat med en <code class=\"docutils literal notranslate\">Question</code>.</p>\n<p>Dessa koncept representeras av Python-klasser. Redigera filen <code class=\"file docutils literal notranslate\">polls/models.py</code> så att den ser ut så här:</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.db</span> <span class=\"kn\">import</span> models\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    question_text <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    pub_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateTimeField<span class=\"p\">(</span><span class=\"s2\">&quot;date published&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Choice</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    question <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Question<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    choice_text <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    votes <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Här representeras varje modell av en klass som subklassar <a class=\"reference internal\" href=\"/sv/6.1/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\">django.db.models.Model</code></a>. Varje modell har ett antal klassvariabler, som var och en representerar ett databasfält i modellen.</p>\n<p>Varje fält representeras av en instans av en <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a>-klass - t.ex. <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> för teckenfält och <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\">DateTimeField</code></a> för datatider. Detta talar om för Django vilken typ av data varje fält innehåller.</p>\n<p>Namnet på varje <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a>-instans (t.ex. <code class=\"docutils literal notranslate\">question_text</code> eller <code class=\"docutils literal notranslate\">pub_date</code>) är fältets namn i ett maskinvänligt format. Du kommer att använda detta värde i din Python-kod och din databas kommer att använda det som kolumnnamn.</p>\n<p>Du kan använda ett valfritt första positionellt argument till en <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> för att ange ett mänskligt läsbart namn. Det används i ett par introspektiva delar av Django, och det fungerar även som dokumentation. Om detta fält inte tillhandahålls kommer Django att använda det maskinläsbara namnet. I det här exemplet har vi bara definierat ett mänskligt läsbart namn för <code class=\"docutils literal notranslate\">Question.pub_date</code>. För alla andra fält i denna modell kommer fältets maskinläsbara namn att räcka som dess mänskligt läsbara namn.</p>\n<p>Vissa <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a>-klasser har obligatoriska argument. <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a>, till exempel, kräver att du ger den en <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.CharField.max_length\" title=\"django.db.models.CharField.max_length\"><code class=\"xref py py-attr docutils literal notranslate\">max_length</code></a>. Det används inte bara i databasschemat utan även i valideringen, som vi snart ska se.</p>\n<p>En <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> kan också ha olika valfria argument; i det här fallet har vi satt <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\">default</code></a>-värdet för <code class=\"docutils literal notranslate\">votes</code> till 0.</p>\n<p>Slutligen, notera att ett förhållande definieras med <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\">ForeignKey</code></a>. Det säger till Django att varje <code class=\"docutils literal notranslate\">Choice</code> är relaterad till en enda <code class=\"docutils literal notranslate\">Question</code>. Django stöder alla vanliga databasrelationer: många-till-en, många-till-många och en-till-en.</p>\n</section>\n<section id=\"activating-models\">\n<h2>Aktivering av modeller<a class=\"heading-anchor\" href=\"#activating-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Den lilla biten modellkod ger Django en hel del information. Med den kan Django göra följande:</p>\n<ul class=\"simple\">\n<li><p>Skapa ett databasschema (<code class=\"docutils literal notranslate\">CREATE TABLE</code>-uttalanden) för den här appen.</p></li>\n<li><p>Skapa ett Python API för databasåtkomst för åtkomst till objekten <code class=\"docutils literal notranslate\">Question</code> och <code class=\"docutils literal notranslate\">Choice</code>.</p></li>\n</ul>\n<p>Men först måste vi tala om för vårt projekt att appen <code class=\"docutils literal notranslate\">polls</code> är installerad.</p>\n<aside class=\"admonition-philosophy admonition\" role=\"note\">\n<p class=\"admonition-title\">Filosofi</p>\n<p>Django-appar är ”pluggbara”: Du kan använda en app i flera projekt och du kan distribuera appar, eftersom de inte behöver vara knutna till en viss Django-installation.</p>\n</aside>\n<p>För att inkludera appen i vårt projekt måste vi lägga till en referens till dess konfigurationsklass i inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>. Klassen <code class=\"docutils literal notranslate\">PollsConfig</code> finns i filen <code class=\"file docutils literal notranslate\">polls/apps.py</code>, så dess prickade sökväg är <code class=\"docutils literal notranslate\">'polls.apps.PollsConfig'</code>. Redigera filen <code class=\"file docutils literal notranslate\">mysite/settings.py</code> och lägg till den prickade sökvägen i inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>. Det kommer att se ut så här:</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>INSTALLED_APPS <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;polls.apps.PollsConfig&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.admin&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.auth&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.contenttypes&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.sessions&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.messages&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.staticfiles&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Nu vet Django att appen <code class=\"docutils literal notranslate\">polls</code> ska inkluderas. Låt oss köra ett annat kommando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-1-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 manage.py makemigrations polls\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-1-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 manage.py makemigrations polls\n</code></pre></div></div></div>\n<p>Du bör se något som liknar följande:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>Migrations for &#39;polls&#39;:\n  polls/migrations/0001_initial.py\n    + Create model Question\n    + Create model Choice\n</code></pre></div>\n<p>Genom att köra <code class=\"docutils literal notranslate\">makemigrations</code> talar du om för Django att du har gjort några ändringar i dina modeller (i det här fallet har du gjort nya) och att du vill att ändringarna ska lagras som en <em>migration</em>.</p>\n<p>Migreringar är hur Django lagrar ändringar i dina modeller (och därmed ditt databasschema) - de är filer på disken. Du kan läsa migreringen för din nya modell om du vill; det är filen <code class=\"docutils literal notranslate\">polls/migrations/0001_initial.py</code>. Oroa dig inte, du förväntas inte läsa dem varje gång Django gör en, men de är utformade för att vara mänskligt redigerbara om du manuellt vill justera hur Django ändrar saker.</p>\n<p>Om du är intresserad kan du också köra <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-check\"><code class=\"xref std std-djadmin docutils literal notranslate\">python manage.py check</code></a>; detta kontrollerar eventuella problem i ditt projekt utan att göra migreringar eller röra databasen.</p>\n<p>Kör nu <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> igen för att skapa dessa modelltabeller i din databas:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-2-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 manage.py migrate\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Apply all migrations: admin, auth, contenttypes, polls, sessions</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Applying polls.0001_initial... OK</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-2-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 manage.py migrate\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Apply all migrations: admin, auth, contenttypes, polls, sessions</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Applying polls.0001_initial... OK</span>\n</code></pre></div></div></div>\n<p>Kommandot <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> tar alla migreringar som inte har tillämpats (Django spårar vilka som tillämpas med hjälp av en speciell tabell i din databas som heter <code class=\"docutils literal notranslate\">django_migrations</code>) och kör dem mot din databas - i huvudsak synkroniserar de ändringar du gjorde i dina modeller med schemat i databasen.</p>\n<p>Migreringar är mycket kraftfulla och låter dig ändra dina modeller över tid, när du utvecklar ditt projekt, utan att du behöver ta bort din databas eller tabeller och skapa nya - det är specialiserat på att uppgradera din databas live, utan att förlora data. Vi kommer att gå igenom dem mer ingående i en senare del av handledningen, men för tillfället bör du komma ihåg trestegsguiden för att göra modelländringar:</p>\n<ul class=\"simple\">\n<li><p>Ändra dina modeller (i <code class=\"docutils literal notranslate\">models.py</code>).</p></li>\n<li><p>Kör <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">python manage.py makemigrations</code></a> för att skapa migreringar för dessa ändringar.</p></li>\n<li><p>Kör <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">python manage.py migrate</code></a> för att tillämpa dessa ändringar i databasen.</p></li>\n</ul>\n<p>Anledningen till att det finns separata kommandon för att skapa och tillämpa migreringar är att du ska överföra migreringar till ditt versionshanteringssystem och skicka dem med din app; de gör inte bara din utveckling enklare, de kan också användas av andra utvecklare och i produktionen.</p>\n<p>See <a class=\"reference internal\" href=\"/sv/6.1/topics/migrations/\"><span class=\"doc\">Migreringar</span></a> for the full details, including how to inspect\nthe SQL a migration will run with <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-sqlmigrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">sqlmigrate</code></a> (see\n<a class=\"reference internal\" href=\"/sv/6.1/topics/migrations/#executing-sqlmigrate\"><span class=\"std std-ref\">Executing sqlmigrate</span></a>).</p>\n<p>Läs <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/\"><span class=\"doc\">django-admin-dokumentationen</span></a> för fullständig information om vad verktyget <code class=\"docutils literal notranslate\">manage.py</code> kan göra.</p>\n</section>\n<section id=\"playing-with-the-api\">\n<h2>Leka med API:et<a class=\"heading-anchor\" href=\"#playing-with-the-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Låt oss nu hoppa in i det interaktiva Python-skalet och leka med det kostnadsfria API som Django ger dig. För att anropa Python-skalet använder du det här kommandot:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-3-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 manage.py shell\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-3-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 manage.py shell\n</code></pre></div></div></div>\n<p>Vi använder detta i stället för att helt enkelt skriva ”python”, eftersom <code class=\"file docutils literal notranslate\">manage.py</code> ställer in miljövariabeln <span class=\"target\" id=\"index-2\"></span><a class=\"reference internal\" href=\"/sv/6.1/topics/settings/#envvar-DJANGO_SETTINGS_MODULE\"><code class=\"xref std std-envvar docutils literal notranslate\">DJANGO_SETTINGS_MODULE</code></a>, som ger Django Python-importsökvägen till din <code class=\"file docutils literal notranslate\">mysite/settings.py</code>-fil. Som standard importerar kommandot <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-shell\"><code class=\"xref std std-djadmin docutils literal notranslate\">shell</code></a> automatiskt modellerna från din <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>.</p>\n<p>När du väl är inne i skalet kan du utforska <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/\"><span class=\"doc\">databas-API</span></a>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"go\"># No questions are in the system yet.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n\n<span class=\"go\"># Create a new Question.</span>\n<span class=\"go\"># Support for time zones is enabled in the default settings file, so</span>\n<span class=\"go\"># Django expects a datetime with tzinfo for pub_date. Use timezone.now()</span>\n<span class=\"go\"># instead of datetime.datetime.now() and it will do the right thing.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Question<span class=\"p\">(</span>question_text<span class=\"o\">=</span><span class=\"s2\">&quot;What&#39;s new?&quot;</span><span class=\"p\">,</span> pub_date<span class=\"o\">=</span>timezone<span class=\"o\">.</span>now<span class=\"p\">())</span>\n\n<span class=\"go\"># Save the object into the database. You have to call save() explicitly.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"go\"># Now it has an ID.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>id\n<span class=\"go\">1</span>\n\n<span class=\"go\"># Access model field values via Python attributes.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>question_text\n<span class=\"go\">&quot;What&#39;s new?&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>pub_date\n<span class=\"go\">datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.UTC)</span>\n\n<span class=\"go\"># Change values by changing the attributes, then calling save().</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>question_text <span class=\"o\">=</span> <span class=\"s2\">&quot;What&#39;s up?&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"go\"># objects.all() displays all the questions in the database.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: Question object (1)&gt;]&gt;</span>\n</code></pre></div>\n<p>Vänta lite. <code class=\"docutils literal notranslate\">&lt;Fråga: Fråga objekt (1)&gt;</code> är inte en användbar representation av detta objekt. Låt oss fixa det genom att redigera modellen <code class=\"docutils literal notranslate\">Question</code> (i filen <code class=\"docutils literal notranslate\">polls/models.py</code>) och lägga till en <a class=\"reference internal\" href=\"/sv/6.1/ref/models/instances/#django.db.models.Model.__str__\" title=\"django.db.models.Model.__str__\"><code class=\"xref py py-meth docutils literal notranslate\">__str__()</code></a>-metod till både <code class=\"docutils literal notranslate\">Question</code> och <code class=\"docutils literal notranslate\">Choice</code>:</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.db</span> <span class=\"kn\">import</span> models\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=\"k\">def</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>question_text\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Choice</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</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>choice_text\n</code></pre></figure>\n<p>Det är viktigt att lägga till <a class=\"reference internal\" href=\"/sv/6.1/ref/models/instances/#django.db.models.Model.__str__\" title=\"django.db.models.Model.__str__\"><code class=\"xref py py-meth docutils literal notranslate\">__str__()</code></a>-metoder till dina modeller, inte bara för din egen bekvämlighet när du hanterar den interaktiva prompten, utan också för att objektens representationer används i Djangos automatiskt genererade admin.</p>\n<p id=\"tutorial02-import-timezone\">Låt oss också lägga till en anpassad metod till den här modellen:</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\">import</span> <span class=\"nn\">datetime</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\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=\"k\">def</span> <span class=\"nf\">was_published_recently</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>pub_date <span class=\"o\">&gt;=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span> <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>\n</code></pre></figure>\n<p>Notera tillägget av <code class=\"docutils literal notranslate\">import datetime</code> och <code class=\"docutils literal notranslate\">from django.utils import timezone</code>, för att referera till Pythons standardmodul <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#module-datetime\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">datetime</code></a> respektive Djangos tidszonsrelaterade verktyg i <a class=\"reference internal\" href=\"/sv/6.1/ref/utils/#module-django.utils.timezone\" title=\"django.utils.timezone: Timezone support.\"><code class=\"xref py py-mod docutils literal notranslate\">django.utils.timezone</code></a>. Om du inte är bekant med tidszonshantering i Python kan du lära dig mer i <a class=\"reference internal\" href=\"/sv/6.1/topics/i18n/timezones/\"><span class=\"doc\">time zone support docs</span></a>.</p>\n<p>Spara dessa ändringar och starta ett nytt interaktivt Python-skal. (Om en prompt med tre vinklar (&gt;&gt;&gt;) indikerar att du fortfarande befinner dig i skalet måste du först avsluta med <code class=\"docutils literal notranslate\">exit()</code>). Kör <code class=\"docutils literal notranslate\">python manage.py shell</code> igen för att uppdatera modellerna.</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console code\"><code><span class=\"go\"># Make sure our __str__() addition worked.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: What&#39;s up?&gt;]&gt;</span>\n\n<span class=\"go\"># Django provides a rich database lookup API that&#39;s entirely driven by</span>\n<span class=\"go\"># keyword arguments.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: What&#39;s up?&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>question_text__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;What&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: What&#39;s up?&gt;]&gt;</span>\n\n<span class=\"go\"># Get the question that was published this year.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"gp\">&gt;&gt;&gt; </span>current_year <span class=\"o\">=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span><span class=\"o\">.</span>year\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span>current_year<span class=\"p\">)</span>\n<span class=\"go\">&lt;Question: What&#39;s up?&gt;</span>\n\n<span class=\"go\"># Request an ID that doesn&#39;t exist, this will raise an exception.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n    <span class=\"o\">...</span>\n<span class=\"gr\">DoesNotExist</span>: Question matching query does not exist.\n\n<span class=\"x\"># Lookup by a primary key is the most common case, so Django provides a</span>\n<span class=\"x\"># shortcut for primary-key exact lookups.</span>\n<span class=\"x\"># The following is identical to Question.objects.get(id=1).</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Question: What&#39;s up?&gt;</span>\n\n<span class=\"go\"># Make sure our custom method worked.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>was_published_recently<span class=\"p\">()</span>\n<span class=\"go\">True</span>\n\n<span class=\"go\"># Give the Question a couple of Choices. The create call constructs a new</span>\n<span class=\"go\"># Choice object, does the INSERT statement, adds the choice to the set</span>\n<span class=\"go\"># of available choices and returns the new Choice object. Django creates</span>\n<span class=\"go\"># a set (defined as &quot;choice_set&quot;) to hold the &quot;other side&quot; of a ForeignKey</span>\n<span class=\"go\"># relation (e.g. a question&#39;s choice) which can be accessed via the API.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Display any choices from the related object set -- none so far.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n\n<span class=\"go\"># Create three choices.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>create<span class=\"p\">(</span>choice_text<span class=\"o\">=</span><span class=\"s2\">&quot;Not much&quot;</span><span class=\"p\">,</span> votes<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Choice: Not much&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>create<span class=\"p\">(</span>choice_text<span class=\"o\">=</span><span class=\"s2\">&quot;The sky&quot;</span><span class=\"p\">,</span> votes<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Choice: The sky&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>c <span class=\"o\">=</span> q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>create<span class=\"p\">(</span>choice_text<span class=\"o\">=</span><span class=\"s2\">&quot;Just hacking again&quot;</span><span class=\"p\">,</span> votes<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Choice objects have API access to their related Question objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>c<span class=\"o\">.</span>question\n<span class=\"go\">&lt;Question: What&#39;s up?&gt;</span>\n\n<span class=\"go\"># And vice versa: Question objects get access to Choice objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"go\">3</span>\n\n<span class=\"go\"># The API automatically follows relationships as far as you need.</span>\n<span class=\"go\"># Use double underscores to separate relationships.</span>\n<span class=\"go\"># This works as many levels deep as you want; there&#39;s no limit.</span>\n<span class=\"go\"># Find all Choices for any question whose pub_date is in this year</span>\n<span class=\"go\"># (reusing the &#39;current_year&#39; variable we created above).</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Choice<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>question__pub_date__year<span class=\"o\">=</span>current_year<span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&gt;</span>\n\n<span class=\"go\"># Let&#39;s delete one of the choices. Use delete() for that.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>c <span class=\"o\">=</span> q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>filter<span class=\"p\">(</span>choice_text__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;Just hacking&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>c<span class=\"o\">.</span>delete<span class=\"p\">()</span>\n</code></pre></div>\n<p>För mer information om modellrelationer, se <a class=\"reference internal\" href=\"/sv/6.1/ref/models/relations/\"><span class=\"doc\">Accessing related objects</span></a>. Mer information om hur du använder dubbla understrykningstecken för att göra fältuppslagningar via API:et finns i <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/#field-lookups-intro\"><span class=\"std std-ref\">Field lookups</span></a>. För fullständig information om databas-API:et, se vår <a class=\"reference internal\" href=\"/sv/6.1/topics/db/queries/\"><span class=\"doc\">Database API reference</span></a>.</p>\n</section>\n<section id=\"introducing-the-django-admin\">\n<h2>Introduktion till Django Admin<a class=\"heading-anchor\" href=\"#introducing-the-django-admin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"admonition-philosophy admonition\" role=\"note\">\n<p class=\"admonition-title\">Filosofi</p>\n<p>Att skapa administratörswebbplatser för din personal eller dina kunder för att lägga till, ändra och ta bort innehåll är ett tråkigt arbete som inte kräver mycket kreativitet. Av den anledningen automatiserar Django helt skapandet av administratörsgränssnitt för modeller.</p>\n<p>Django skrevs i en nyhetsrumsmiljö, med en mycket tydlig åtskillnad mellan ”innehållsutgivare” och den ”offentliga” webbplatsen. Webbplatsadministratörer använder systemet för att lägga till nyheter, händelser, sportresultat etc., och det innehållet visas på den offentliga webbplatsen. Django löser problemet med att skapa ett enhetligt gränssnitt för webbplatsadministratörer för att redigera innehåll.</p>\n<p>Administratören är inte avsedd att användas av webbplatsbesökare. Den är till för webbplatsansvariga.</p>\n</aside>\n<section id=\"creating-an-admin-user\">\n<h3>Skapa en administratörsanvändare<a class=\"heading-anchor\" href=\"#creating-an-admin-user\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Först måste vi skapa en användare som kan logga in på administratörssidan. Kör följande kommando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-4-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 manage.py createsuperuser\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-4-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 manage.py createsuperuser\n</code></pre></div></div></div>\n<p>Ange önskat användarnamn och tryck på Enter.</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>Username: admin\n</code></pre></div>\n<p>Du kommer sedan att bli ombedd att ange önskad e-postadress:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>Email address: admin@example.com\n</code></pre></div>\n<p>Det sista steget är att ange ditt lösenord. Du kommer att bli ombedd att ange ditt lösenord två gånger, den andra gången som en bekräftelse på den första.</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>Password: **********\nPassword (again): *********\nSuperuser created successfully.\n</code></pre></div>\n</section>\n<section id=\"start-the-development-server\">\n<h3>Starta utvecklingsservern<a class=\"heading-anchor\" href=\"#start-the-development-server\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django-administratörssidan är aktiverad som standard. Låt oss starta utvecklingsservern och utforska den.</p>\n<p>Om servern inte är igång startar du den på följande sätt:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-5-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 manage.py runserver\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-5-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 manage.py runserver\n</code></pre></div></div></div>\n<p>Öppna nu en webbläsare och gå till ”/admin/” på din lokala domän, t.ex. <a class=\"reference external\" href=\"http://127.0.0.1:8000/admin/\">http://127.0.0.1:8000/admin/</a>. Du bör se administratörens inloggningsskärm:</p>\n<img alt=\"Django admin inloggningsskärm\" src=\"/sv/6.1/_images/admin01.png\" />\n<p>Eftersom <a class=\"reference internal\" href=\"/sv/6.1/topics/i18n/translation/\"><span class=\"doc\">translation</span></a> är aktiverad som standard, om du anger <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a>, kommer inloggningsskärmen att visas på det angivna språket (om Django har lämpliga översättningar).</p>\n</section>\n<section id=\"enter-the-admin-site\">\n<h3>Ange administratörens webbplats<a class=\"heading-anchor\" href=\"#enter-the-admin-site\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Försök nu att logga in med det superanvändarkonto som du skapade i föregående steg. Du bör se Django-administratörens indexsida:</p>\n<img alt=\"Django admin indexsida\" src=\"/sv/6.1/_images/admin02.png\" />\n<p>Du bör se några typer av redigerbart innehåll: grupper och användare. De tillhandahålls av <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\">django.contrib.auth</code></a>, det autentiseringsramverk som levereras av Django.</p>\n</section>\n<section id=\"make-the-poll-app-modifiable-in-the-admin\">\n<h3>Gör röstningsappen ändringsbar i administratören<a class=\"heading-anchor\" href=\"#make-the-poll-app-modifiable-in-the-admin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Men var är vår poll-app? Den visas inte på adminindexsidan.</p>\n<p>Det är bara en sak kvar att göra: vi måste tala om för administratören att <code class=\"docutils literal notranslate\">Question</code>-objekt har ett administratörsgränssnitt. För att göra detta, öppna filen <code class=\"file docutils literal notranslate\">polls/admin.py</code> och redigera den så att den ser ut så här:</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\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Question<span class=\"p\">)</span>\n</code></pre></figure>\n</section>\n<section id=\"explore-the-free-admin-functionality\">\n<h3>Utforska de kostnadsfria adminfunktionerna<a class=\"heading-anchor\" href=\"#explore-the-free-admin-functionality\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Nu när vi har registrerat <code class=\"docutils literal notranslate\">Question</code> vet Django att den ska visas på adminindexsidan:</p>\n<img alt=\"Django admin indexsida, nu med omröstningar som visas\" src=\"/sv/6.1/_images/admin03t.png\" />\n<p>Klicka på ”Frågor”. Nu är du på sidan ”Ändra lista” för frågor. På den här sidan visas alla frågor i databasen och du kan välja en fråga för att ändra den. Det finns frågan ”Vad händer?” som vi skapade tidigare:</p>\n<img alt=\"Omröstningar ändrar listsida\" src=\"/sv/6.1/_images/admin04t.png\" />\n<p>Klicka på frågan ”Vad händer?” för att redigera den:</p>\n<img alt=\"Redigering av formulär för frågeobjekt\" src=\"/sv/6.1/_images/admin05t.png\" />\n<p>Saker att notera här:</p>\n<ul class=\"simple\">\n<li><p>Formuläret genereras automatiskt från modellen <code class=\"docutils literal notranslate\">Question</code>.</p></li>\n<li><p>De olika modellfälttyperna (<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\">DateTimeField</code></a>, <a class=\"reference internal\" href=\"/sv/6.1/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a>) motsvarar lämplig HTML-inmatningswidget. Varje fälttyp vet hur den ska visas i Django-admin.</p></li>\n<li><p>Varje <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\">DateTimeField</code></a> får gratis JavaScript-genvägar. Datum får en ”Today”-genväg och en popup-kalender, och tider får en ”Now”-genväg och en praktisk popup som listar vanliga inmatade tider.</p></li>\n</ul>\n<p>Längst ner på sidan finns ett par alternativ:</p>\n<ul class=\"simple\">\n<li><p>Save – Sparar ändringar och återgår till sidan med ändringslistan för den här typen av objekt.</p></li>\n<li><p>Spara och fortsätt redigera – Sparar ändringar och laddar om adminsidan för det här objektet.</p></li>\n<li><p>Save and add another – Sparar ändringar och laddar ett nytt, tomt formulär för den här typen av objekt.</p></li>\n<li><p>Delete – Visar en bekräftelsesida för radering.</p></li>\n</ul>\n<p>Om värdet för ”Date published” inte stämmer överens med den tidpunkt då du skapade frågan i <a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial01/\"><span class=\"doc\">Tutorial 1</span></a>, betyder det förmodligen att du har glömt att ange rätt värde för inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_ZONE</code></a>. Ändra den, ladda om sidan och kontrollera att rätt värde visas.</p>\n<p>Ändra ”Datum publicerat” genom att klicka på genvägarna ”Idag” och ”Nu”. Klicka sedan på ”Spara och fortsätt redigera” Klicka sedan på ”Historik” längst upp till höger. Du kommer att se en sida som listar alla ändringar som gjorts i detta objekt via Django-admin, med tidsstämpel och användarnamn för den person som gjorde ändringen:</p>\n<img alt=\"Historiksida för frågeobjekt\" src=\"/sv/6.1/_images/admin06t.png\" />\n<p>När du känner dig bekväm med API:et för modeller och har bekantat dig med adminwebbplatsen kan du läsa <a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial03/\"><span class=\"doc\">del 3 av denna handledning</span></a> för att lära dig hur du lägger till fler vyer i vår polls-app.</p>\n</section>\n</section>","rootId":"writing-your-first-django-app-part-2","toc":[{"title":"Uppsättning av databas","anchor":"database-setup","children":[]},{"title":"Skapa modeller","anchor":"creating-models","children":[]},{"title":"Aktivering av modeller","anchor":"activating-models","children":[]},{"title":"Leka med API:et","anchor":"playing-with-the-api","children":[]},{"title":"Introduktion till Django Admin","anchor":"introducing-the-django-admin","children":[{"title":"Skapa en administratörsanvändare","anchor":"creating-an-admin-user","children":[]},{"title":"Starta utvecklingsservern","anchor":"start-the-development-server","children":[]},{"title":"Ange administratörens webbplats","anchor":"enter-the-admin-site","children":[]},{"title":"Gör röstningsappen ändringsbar i administratören","anchor":"make-the-poll-app-modifiable-in-the-admin","children":[]},{"title":"Utforska de kostnadsfria adminfunktionerna","anchor":"explore-the-free-admin-functionality","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Kom igång","url":"/sv/6.1/intro/"}],"prev":{"docname":"intro/tutorial01","title":"Skriva din första Django-app, del 1","url":"/sv/6.1/intro/tutorial01/"},"next":{"docname":"intro/tutorial03","title":"Skriva din första Django-app, del 3","url":"/sv/6.1/intro/tutorial03/"},"formats":{"html":"/sv/6.1/intro/tutorial02/","markdown":"/sv/6.1/intro/tutorial02.md","json":"/sv/6.1/intro/tutorial02.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/intro/tutorial02.txt","official":"https://docs.djangoproject.com/sv/6.1/intro/tutorial02/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}