{"title":"Kodningsstil","version":"5.2","locale":"sv","docname":"internals/contributing/writing-code/coding-style","url":"/sv/5.2/internals/contributing/writing-code/coding-style/","canonical":"https://djangodocs.dev/sv/5.2/internals/contributing/writing-code/coding-style/","summary":"Följ dessa kodningsstandarder när du skriver kod som ska inkluderas i Django. Kontroller före åtagandet Link to this heading # pre-commit är ett ramverk för att…","html":"<h1>Kodningsstil<a class=\"heading-anchor\" href=\"#coding-style\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Följ dessa kodningsstandarder när du skriver kod som ska inkluderas i Django.</p>\n<section id=\"pre-commit-checks\">\n<span id=\"coding-style-pre-commit\"></span><h2>Kontroller före åtagandet<a class=\"heading-anchor\" href=\"#pre-commit-checks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference external\" href=\"https://pre-commit.com\">pre-commit</a> är ett ramverk för att hantera pre-commit hooks. Dessa hooks hjälper till att identifiera enkla problem innan koden skickas för granskning. Genom att kontrollera dessa problem före kodgranskningen kan granskaren fokusera på själva ändringen, och det kan också bidra till att minska antalet CI-körningar.</p>\n<p>För att använda verktyget måste du först installera <code class=\"docutils literal notranslate\"><span class=\"pre\">pre-commit</span></code> och sedan git-hooks:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>pre-commit\n<span class=\"gp\">$ </span>pre-commit<span class=\"w\"> </span>install\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 -m pip install pre-commit\n<span class=\"gp\">...\\&gt;</span> pre-commit install\n</code></pre></div></div></div>\n<p>Vid det första åtagandet kommer <code class=\"docutils literal notranslate\"><span class=\"pre\">pre-commit</span></code> att installera hooks, dessa installeras i sina egna miljöer och tar en kort stund att installera vid första körningen. Efterföljande kontroller kommer att vara betydligt snabbare. Om ett fel hittas kommer ett lämpligt felmeddelande att visas. Om felet gällde <code class=\"docutils literal notranslate\"><span class=\"pre\">black</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">isort</span></code> kommer verktyget att gå vidare och åtgärda dem åt dig. Granska ändringarna och lägg upp dem på nytt för commit om du är nöjd med dem.</p>\n</section>\n<section id=\"python-style\">\n<span id=\"coding-style-python\"></span><h2>Python-stil<a class=\"heading-anchor\" href=\"#python-style\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul>\n<li><p>Alla filer bör formateras med hjälp av den automatiska formateraren <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/black/\">black</a>. Detta kommer att köras av <code class=\"docutils literal notranslate\"><span class=\"pre\">pre-commit</span></code> om det är konfigurerat.</p></li>\n<li><p>Projektarkivet innehåller en fil med namnet <code class=\"docutils literal notranslate\"><span class=\"pre\">.editorconfig</span></code>. Vi rekommenderar att du använder en textredigerare med stöd för <a class=\"reference external\" href=\"https://editorconfig.org/\">EditorConfig</a> för att undvika problem med indragning och blanksteg. Python-filerna använder 4 mellanslag för indragning och HTML-filerna använder 2 mellanslag.</p></li>\n<li><p>Om inte annat anges, följ <span class=\"target\" id=\"index-14\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0008/\"><strong>PEP 8</strong></a>.</p>\n<p>Använd <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/flake8/\">flake8</a> för att kontrollera om det finns problem i detta område. Observera att vår <code class=\"docutils literal notranslate\"><span class=\"pre\">.flake8</span></code>-fil utesluter vissa fel som vi inte anser vara grova överträdelser. Kom ihåg att <span class=\"target\" id=\"index-15\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0008/\"><strong>PEP 8</strong></a> endast är en riktlinje, så respektera stilen i den omgivande koden som ett primärt mål.</p>\n<p>Ett undantag från <span class=\"target\" id=\"index-16\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0008/\"><strong>PEP 8</strong></a> är våra regler om radlängder. Begränsa inte kodrader till 79 tecken om det innebär att koden ser betydligt fulare ut eller är svårare att läsa. Vi tillåter upp till 88 tecken eftersom detta är den radlängd som används av <code class=\"docutils literal notranslate\"><span class=\"pre\">black</span></code>. Denna kontroll ingår när du kör <code class=\"docutils literal notranslate\"><span class=\"pre\">flake8</span></code>. Dokumentation, kommentarer och docstrings bör vara omslutna av 79 tecken, även om <span class=\"target\" id=\"index-17\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0008/\"><strong>PEP 8</strong></a> föreslår 72.</p>\n</li>\n<li><p>Interpolering av strängvariabler kan använda <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#old-string-formatting\" title=\"(in Python v3.14)\"><span class=\"xref std std-ref\">%-formatting</span></a>, <a class=\"reference external\" href=\"https://docs.python.org/3/reference/lexical_analysis.html#f-strings\" title=\"(in Python v3.14)\"><span class=\"xref std std-ref\">f-strings</span></a>, eller <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str.format\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">str.format()</span></code></a> på lämpligt sätt, med målet att maximera kodens läsbarhet.</p>\n<p>Slutliga bedömningar av läsbarheten lämnas till Merger’s diskretion. Som en vägledning bör f-strängar endast använda vanlig variabel- och egenskapsåtkomst, med föregående lokal variabeltilldelning för mer komplexa fall:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Allowed</span>\n<span class=\"sa\">f</span><span class=\"s2\">&quot;hello </span><span class=\"si\">{</span><span class=\"n\">user</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span>\n<span class=\"sa\">f</span><span class=\"s2\">&quot;hello </span><span class=\"si\">{</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span>\n<span class=\"sa\">f</span><span class=\"s2\">&quot;hello </span><span class=\"si\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span>\n\n<span class=\"c1\"># Disallowed</span>\n<span class=\"sa\">f</span><span class=\"s2\">&quot;hello </span><span class=\"si\">{</span><span class=\"n\">get_user</span><span class=\"p\">()</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span>\n<span class=\"sa\">f</span><span class=\"s2\">&quot;you are </span><span class=\"si\">{</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">age</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"mf\">365.25</span><span class=\"si\">}</span><span class=\"s2\"> days old&quot;</span>\n\n<span class=\"c1\"># Allowed with local variable assignment</span>\n<span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">get_user</span><span class=\"p\">()</span>\n<span class=\"sa\">f</span><span class=\"s2\">&quot;hello </span><span class=\"si\">{</span><span class=\"n\">user</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span>\n<span class=\"n\">user_days_old</span> <span class=\"o\">=</span> <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">age</span> <span class=\"o\">*</span> <span class=\"mf\">365.25</span>\n<span class=\"sa\">f</span><span class=\"s2\">&quot;you are </span><span class=\"si\">{</span><span class=\"n\">user_days_old</span><span class=\"si\">}</span><span class=\"s2\"> days old&quot;</span>\n</code></pre></div>\n<p>f-strings bör inte användas för strängar som kan behöva översättas, t.ex. fel- och loggmeddelanden. I allmänhet är <code class=\"docutils literal notranslate\"><span class=\"pre\">format()</span></code> mer omständlig, så de andra formateringsmetoderna är att föredra.</p>\n<p>Slösa inte tid på att göra en orelaterad refaktorisering av befintlig kod för att justera formateringsmetoden.</p>\n</li>\n<li><p>Undvik att använda ”vi” i kommentarer, t.ex. ”Loop over” i stället för ”We loop over”.</p></li>\n<li><p>Använd understrykningstecken, inte camelCase, för variabel-, funktions- och metodnamn (t.ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">poll.get_unique_voters()</span></code>, inte <code class=\"docutils literal notranslate\"><span class=\"pre\">poll.getUniqueVoters()</span></code>).</p></li>\n<li><p>Använd <code class=\"docutils literal notranslate\"><span class=\"pre\">InitialCaps</span></code> för klassnamn (eller för fabriksfunktioner som returnerar klasser).</p></li>\n<li><p>I dokumentationer, följ stilen för befintliga dokumentationer och <span class=\"target\" id=\"index-18\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0257/\"><strong>PEP 257</strong></a>.</p></li>\n<li><p>I tester, använd <a class=\"reference internal\" href=\"/sv/5.2/topics/testing/tools/#django.test.SimpleTestCase.assertRaisesMessage\" title=\"django.test.SimpleTestCase.assertRaisesMessage\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertRaisesMessage()</span></code></a> och <a class=\"reference internal\" href=\"/sv/5.2/topics/testing/tools/#django.test.SimpleTestCase.assertWarnsMessage\" title=\"django.test.SimpleTestCase.assertWarnsMessage\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertWarnsMessage()</span></code></a> istället för <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertRaises\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertRaises()</span></code></a> och <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertWarns\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertWarns()</span></code></a> så att du kan kontrollera undantaget eller varningsmeddelandet. Använd <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertRaisesRegex\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertRaisesRegex()</span></code></a> och <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertWarnsRegex\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertWarnsRegex()</span></code></a> endast om du behöver matchning med reguljära uttryck.</p>\n<p>Använd <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertIs\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertIs(...,</span> <span class=\"pre\">True/False)</span></code></a> för att testa booleska värden, snarare än <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertTrue\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertTrue()</span></code></a> och <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertFalse\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertFalse()</span></code></a>, så att du kan kontrollera det faktiska booleska värdet, inte sanningshalten i uttrycket.</p>\n</li>\n<li><p>I testdokumentationer ska du ange det förväntade beteende som varje test demonstrerar. Inkludera inte ingresser som ”Testar att” eller ”Säkerställer att”.</p>\n<p>Reservera ärendehänvisningar för obskyra frågor där ärendet innehåller ytterligare detaljer som inte enkelt kan beskrivas i dokument eller kommentarer. Inkludera ärendenumret i slutet av en mening så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_foo</span><span class=\"p\">():</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    A test docstring looks like this (#123456).</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</li>\n<li><p>Där det är tillämpligt, använd uppackningsgeneraliseringar som överensstämmer med <span class=\"target\" id=\"index-19\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0448/\"><strong>PEP 448</strong></a>, till exempel sammanslagning av mappningar (<code class=\"docutils literal notranslate\"><span class=\"pre\">{**x,</span> <span class=\"pre\">**y}</span></code>) eller sekvenser (<code class=\"docutils literal notranslate\"><span class=\"pre\">[*a,</span> <span class=\"pre\">*b]</span></code>). Detta förbättrar prestanda, läsbarhet och underhållsmässighet samtidigt som det minskar antalet fel.</p></li>\n</ul>\n</section>\n<section id=\"imports\">\n<span id=\"coding-style-imports\"></span><h2>Importera<a class=\"heading-anchor\" href=\"#imports\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul>\n<li><p>Använd <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/isort/\">isort</a> för att automatisera importsorteringen enligt riktlinjerna nedan.</p>\n<p>Snabb start:</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<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span><span class=\"s2\">&quot;isort &gt;= 7.0.0&quot;</span>\n<span class=\"gp\">$ </span>isort<span class=\"w\"> </span>.\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 -m pip install <span class=\"s2\">&quot;isort &gt;= 7.0.0&quot;</span>\n<span class=\"gp\">...\\&gt;</span> isort .\n</code></pre></div></div></div>\n<p>Detta kör <code class=\"docutils literal notranslate\"><span class=\"pre\">isort</span></code> rekursivt från din aktuella katalog och ändrar alla filer som inte överensstämmer med riktlinjerna. Om du behöver ha import i fel ordning (för att undvika cirkulär import, till exempel), använd en kommentar som denna:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">module</span>  <span class=\"c1\"># isort:skip</span>\n</code></pre></div>\n</li>\n<li><p>Lägg import i dessa grupper: future, standardbibliotek, tredjepartsbibliotek, andra Django-komponenter, lokal Django-komponent, try/excepts. Sortera raderna i varje grupp alfabetiskt efter det fullständiga modulnamnet. Placera alla <code class=\"docutils literal notranslate\"><span class=\"pre\">import</span> <span class=\"pre\">module</span></code>-satser före <code class=\"docutils literal notranslate\"><span class=\"pre\">from</span> <span class=\"pre\">module</span> <span class=\"pre\">import</span> <span class=\"pre\">objects</span></code> i varje avsnitt. Använd absolut import för andra Django-komponenter och relativ import för lokala komponenter.</p></li>\n<li><p>Alfabetisera artiklarna på varje rad med de versala artiklarna grupperade före de gemena artiklarna.</p></li>\n<li><p>Bryt långa rader med parenteser och dra in fortsättningsraderna med 4 mellanslag. Sätt ett efterföljande kommatecken efter den sista importen och sätt den avslutande parentesen på en egen rad.</p>\n<p>Använd en blankrad mellan den sista importen och all kod på modulnivå, och använd två blankrader ovanför den första funktionen eller klassen.</p>\n<p>Till exempel (kommentarerna är endast i förklarande syfte):</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django/contrib/admin/example.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"c1\"># future</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">__future__</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">unicode_literals</span>\n\n<span class=\"c1\"># standard library</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">json</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">itertools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">chain</span>\n\n<span class=\"c1\"># third-party</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">bcrypt</span>\n\n<span class=\"c1\"># Django</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Http404</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http.response</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"p\">(</span>\n    <span class=\"n\">Http404</span><span class=\"p\">,</span>\n    <span class=\"n\">HttpResponse</span><span class=\"p\">,</span>\n    <span class=\"n\">HttpResponseNotAllowed</span><span class=\"p\">,</span>\n    <span class=\"n\">StreamingHttpResponse</span><span class=\"p\">,</span>\n    <span class=\"n\">cookie</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n\n<span class=\"c1\"># local Django</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">LogEntry</span>\n\n<span class=\"c1\"># try/except</span>\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">yaml</span>\n<span class=\"k\">except</span> <span class=\"ne\">ImportError</span><span class=\"p\">:</span>\n    <span class=\"n\">yaml</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n\n<span class=\"n\">CONSTANT</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;foo&quot;</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Example</span><span class=\"p\">:</span> <span class=\"o\">...</span>\n</code></pre></figure>\n</li>\n<li><p>Använd bekvämlighetsimport när det är möjligt. Gör till exempel så här</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">View</span>\n</code></pre></div>\n<p>istället för:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic.base</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">View</span>\n</code></pre></div>\n</li>\n</ul>\n</section>\n<section id=\"template-style\">\n<h2>Mallens stil<a class=\"heading-anchor\" href=\"#template-style\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Följ nedanstående regler i Django mallkod.</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">extends</span> <span class=\"pre\">%}</span></code> bör vara den första raden utan kommentar.</p>\n<p>Gör så här:</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\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">h1</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;font-semibold text-xl&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">pages.title</span> <span class=\"cp\">}}</span>\n  <span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Eller det här:</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=\"c\">{# This is a comment #}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">h1</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;font-semibold text-xl&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">pages.title</span> <span class=\"cp\">}}</span>\n  <span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Gör inte så här:</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\">load</span> <span class=\"nv\">i18n</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">h1</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;font-semibold text-xl&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">pages.title</span> <span class=\"cp\">}}</span>\n  <span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</li>\n<li><p>Lägg till exakt ett mellanslag mellan <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span></code>, variabelinnehåll och <code class=\"docutils literal notranslate\"><span class=\"pre\">}}</span></code>.</p>\n<p>Gör så här:</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=\"nv\">user</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>Gör inte så här:</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=\"nv\">user</span><span class=\"cp\">}}</span>\n</code></pre></div>\n</li>\n<li><p>I <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">...</span> <span class=\"pre\">%}</span></code>, lista bibliotek i alfabetisk ordning.</p>\n<p>Gör så här:</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\">load</span> <span class=\"nv\">i18n</span> <span class=\"nv\">l10</span> <span class=\"nv\">tz</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Gör inte så här:</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\">load</span> <span class=\"nv\">l10</span> <span class=\"nv\">i18n</span> <span class=\"nv\">tz</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</li>\n<li><p>Lägg till exakt ett mellanslag mellan <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span></code>, taggens innehåll och <code class=\"docutils literal notranslate\"><span class=\"pre\">%}</span></code>.</p>\n<p>Gör så här:</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\">load</span> <span class=\"nv\">humanize</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Gör inte så här:</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\">load</span> <span class=\"nv\">humanize</span><span class=\"cp\">%}</span>\n</code></pre></div>\n</li>\n<li><p>Lägg till taggnamnet <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code> i taggen <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endblock</span> <span class=\"pre\">%}</span></code> om den inte står på samma rad.</p>\n<p>Gör så här:</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\">header</span> <span class=\"cp\">%}</span>\n\n  Code goes here\n\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"nv\">header</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Gör inte så här:</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\">header</span> <span class=\"cp\">%}</span>\n\n  Code goes here\n\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</li>\n<li><p>Inom hakparenteser separeras tokens med enkla mellanslag, utom runt <code class=\"docutils literal notranslate\"><span class=\"pre\">.</span></code> för attributåtkomst och <code class=\"docutils literal notranslate\"><span class=\"pre\">|</span></code> för ett filter.</p>\n<p>Gör så här:</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\">if</span> <span class=\"nv\">user.name</span><span class=\"o\">|</span><span class=\"nf\">lower</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;admin&quot;</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Gör inte så här:</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\">if</span> <span class=\"nv\">user</span> <span class=\"p\">.</span> <span class=\"nv\">name</span> <span class=\"o\">|</span> <span class=\"nf\">lower</span>  <span class=\"o\">==</span>  <span class=\"s2\">&quot;admin&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{{</span> <span class=\"nv\">user.name</span> <span class=\"o\">|</span> <span class=\"nf\">upper</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n</li>\n<li><p>Inom en mall som använder <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">extends</span> <span class=\"pre\">%}</span></code>, undvik indragning av toppnivå <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code> taggar.</p>\n<p>Gör så här:</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\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Gör inte så här:</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\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n  <span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n  ...\n</code></pre></div>\n</li>\n</ul>\n</section>\n<section id=\"view-style\">\n<h2>Visa stil<a class=\"heading-anchor\" href=\"#view-style\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul>\n<li><p>I Django-vyer ska den första parametern i en vyfunktion heta <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code>.</p>\n<p>Gör så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">foo</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Gör inte så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">req</span><span class=\"p\">,</span> <span class=\"n\">foo</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n</li>\n</ul>\n</section>\n<section id=\"model-style\">\n<h2>Modell stil<a class=\"heading-anchor\" href=\"#model-style\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul>\n<li><p>Fältnamn ska vara gemener och underscores ska användas i stället för camelCase.</p>\n<p>Gör så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">40</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Gör inte så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">FirstName</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n    <span class=\"n\">Last_Name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">40</span><span class=\"p\">)</span>\n</code></pre></div>\n</li>\n<li><p>Klass Meta bör visas <em>efter</em> att fälten har definierats, med en enda blankrad som skiljer fälten och klassdefinitionen åt.</p>\n<p>Gör så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">40</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">verbose_name_plural</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;people&quot;</span>\n</code></pre></div>\n<p>Gör inte så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">verbose_name_plural</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;people&quot;</span>\n\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">40</span><span class=\"p\">)</span>\n</code></pre></div>\n</li>\n<li><p>Ordningsföljden för modellens inre klasser och standardmetoder bör vara enligt följande (observera att alla inte är obligatoriska):</p>\n<ul class=\"simple\">\n<li><p>Alla databasfält</p></li>\n<li><p>Anpassade chefsattribut</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">klass</span> <span class=\"pre\">Meta</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">def</span> <span class=\"pre\">__str__()</span></code> och andra magiska Python-metoder</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">def</span> <span class=\"pre\">save()</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">def</span> <span class=\"pre\">get_absolute_url()</span></code></p></li>\n<li><p>Eventuella anpassade metoder</p></li>\n</ul>\n</li>\n<li><p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">val</span></code> definieras för ett visst modellfält, definieras varje val som en mappning, med ett namn i versaler som ett klassattribut på modellen. Exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">DIRECTION_UP</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;U&quot;</span>\n    <span class=\"n\">DIRECTION_DOWN</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;D&quot;</span>\n    <span class=\"n\">DIRECTION_CHOICES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"n\">DIRECTION_UP</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Up&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">DIRECTION_DOWN</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Down&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n</code></pre></div>\n<p>Alternativt kan du överväga att använda <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#field-choices-enum-types\"><span class=\"std std-ref\">Uppräkningstyper</span></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Direction</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextChoices</span><span class=\"p\">):</span>\n        <span class=\"n\">UP</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Up&quot;</span>\n        <span class=\"n\">DOWN</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;D&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Down&quot;</span>\n</code></pre></div>\n</li>\n</ul>\n</section>\n<section id=\"use-of-django-conf-settings\">\n<h2>Användning av <code class=\"docutils literal notranslate\"><span class=\"pre\">django.conf.settings</span></code><a class=\"heading-anchor\" href=\"#use-of-django-conf-settings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Moduler bör i allmänhet inte använda inställningar som lagras i <code class=\"docutils literal notranslate\"><span class=\"pre\">django.conf.settings</span></code> på toppnivå (dvs. utvärderas när modulen importeras). Förklaringen till detta är som följer:</p>\n<p>Manuell konfiguration av inställningar (dvs. utan att förlita sig på miljövariabeln <span class=\"target\" id=\"index-20\"></span><a class=\"reference internal\" href=\"/sv/5.2/topics/settings/#envvar-DJANGO_SETTINGS_MODULE\"><code class=\"xref std std-envvar docutils literal notranslate\"><span class=\"pre\">DJANGO_SETTINGS_MODULE</span></code></a>) är tillåten och möjlig enligt följande:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n\n<span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">configure</span><span class=\"p\">({},</span> <span class=\"n\">SOME_SETTING</span><span class=\"o\">=</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Men om någon inställning används före raden <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.configure</span></code> fungerar inte detta. (Internt är <code class=\"docutils literal notranslate\"><span class=\"pre\">settings</span></code> ett <code class=\"docutils literal notranslate\"><span class=\"pre\">LazyObject</span></code> som konfigurerar sig själv automatiskt när inställningarna öppnas om det inte redan har konfigurerats).</p>\n<p>Så om det finns en modul som innehåller kod enligt följande:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_callable</span>\n\n<span class=\"n\">default_foo_view</span> <span class=\"o\">=</span> <span class=\"n\">get_callable</span><span class=\"p\">(</span><span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">FOO_VIEW</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…så kommer import av denna modul att leda till att inställningsobjektet konfigureras. Det innebär att möjligheten för tredje part att importera modulen på högsta nivå är oförenlig med möjligheten att konfigurera inställningsobjektet manuellt, eller gör det mycket svårt under vissa omständigheter.</p>\n<p>Istället för ovanstående kod måste en nivå av lathet eller indirektion användas, till exempel <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.functional.LazyObject</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.functional.lazy()</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">lambda</span></code>.</p>\n</section>\n<section id=\"miscellaneous\">\n<h2>Diverse<a class=\"heading-anchor\" href=\"#miscellaneous\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul class=\"simple\">\n<li><p>Markera alla strängar för internationalisering; se <a class=\"reference internal\" href=\"/sv/5.2/topics/i18n/\"><span class=\"doc\">i18n-dokumentation</span></a> för mer information.</p></li>\n<li><p>Ta bort <code class=\"docutils literal notranslate\"><span class=\"pre\">import</span></code>-satser som inte längre används när du ändrar kod. <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/flake8/\">flake8</a> kommer att identifiera dessa importer åt dig. Om en oanvänd import måste finnas kvar för bakåtkompatibilitet, markera slutet av med <code class=\"docutils literal notranslate\"><span class=\"pre\">#</span> <span class=\"pre\">NOQA</span></code> för att tysta flake8-varningen.</p></li>\n<li><p>Ta systematiskt bort alla efterföljande blanksteg från din kod eftersom de lägger till onödiga byte, lägger till visuell röra i patcherna och ibland också kan orsaka onödiga sammanfogningskonflikter. Vissa IDE:er kan konfigureras så att de automatiskt tar bort dem och de flesta VCS-verktyg kan ställas in så att de markerar dem i diff-utdata.</p></li>\n<li><p>Skriv inte ditt namn i den kod du bidrar med. Vår policy är att hålla bidragsgivarnas namn i filen <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTHORS</span></code> som distribueras med Django - inte utspridda i själva kodbasen. Inkludera gärna en ändring av filen <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTHORS</span></code> i din patch om du gör mer än en enda trivial ändring.</p></li>\n</ul>\n</section>\n<section id=\"javascript-style\">\n<h2>JavaScript-stil<a class=\"heading-anchor\" href=\"#javascript-style\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>För detaljer om den JavaScript-kodstil som används av Django, se <a class=\"reference internal\" href=\"/sv/5.2/internals/contributing/writing-code/javascript/\"><span class=\"doc\">JavaScript-kod</span></a>.</p>\n</section>","rootId":"coding-style","toc":[{"title":"Kontroller före åtagandet","anchor":"pre-commit-checks","children":[]},{"title":"Python-stil","anchor":"python-style","children":[]},{"title":"Importera","anchor":"imports","children":[]},{"title":"Mallens stil","anchor":"template-style","children":[]},{"title":"Visa stil","anchor":"view-style","children":[]},{"title":"Modell stil","anchor":"model-style","children":[]},{"title":"Användning av django.conf.settings","anchor":"use-of-django-conf-settings","children":[]},{"title":"Diverse","anchor":"miscellaneous","children":[]},{"title":"JavaScript-stil","anchor":"javascript-style","children":[]}],"breadcrumbs":[{"docname":"internals/index","title":"Djangos interna funktioner","url":"/sv/5.2/internals/"},{"docname":"internals/contributing/index","title":"Att bidra till Django","url":"/sv/5.2/internals/contributing/"},{"docname":"internals/contributing/writing-code/index","title":"Bidra med kod","url":"/sv/5.2/internals/contributing/writing-code/"}],"prev":{"docname":"internals/contributing/writing-code/working-with-git","title":"Arbeta med Git och GitHub","url":"/sv/5.2/internals/contributing/writing-code/working-with-git/"},"next":{"docname":"internals/contributing/writing-code/javascript","title":"JavaScript-kod","url":"/sv/5.2/internals/contributing/writing-code/javascript/"},"formats":{"html":"/sv/5.2/internals/contributing/writing-code/coding-style/","markdown":"/sv/5.2/internals/contributing/writing-code/coding-style.md","json":"/sv/5.2/internals/contributing/writing-code/coding-style.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/internals/contributing/writing-code/coding-style.txt","official":"https://docs.djangoproject.com/sv/5.2/internals/contributing/writing-code/coding-style/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}