{"title":"Så här skapar du anpassade malltaggar och filter","version":"5.2","locale":"sv","docname":"howto/custom-template-tags","url":"/sv/5.2/howto/custom-template-tags/","canonical":"https://djangodocs.dev/sv/5.2/howto/custom-template-tags/","summary":"Djangos mallspråk levereras med ett brett utbud av inbyggda taggar och filter som är utformade för att tillgodose presentationslogikbehoven i din applikation. Ändå…","html":"<h1>Så här skapar du anpassade malltaggar och filter<a class=\"heading-anchor\" href=\"#how-to-create-custom-template-tags-and-filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Djangos mallspråk levereras med ett brett utbud av <a class=\"reference internal\" href=\"/sv/5.2/ref/templates/builtins/\"><span class=\"doc\">inbyggda taggar och filter</span></a> som är utformade för att tillgodose presentationslogikbehoven i din applikation. Ändå kan det hända att du behöver funktionalitet som inte täcks av kärnuppsättningen av mallprimitiver. Du kan utöka mallmotorn genom att definiera anpassade taggar och filter med Python och sedan göra dem tillgängliga för dina mallar med hjälp av taggen <a class=\"reference internal\" href=\"/sv/5.2/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">%}</span></code></a>.</p>\n<section id=\"code-layout\">\n<h2>Layout för kod<a class=\"heading-anchor\" href=\"#code-layout\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Den vanligaste platsen för att ange anpassade malltaggar och filter är inuti en Django-app. Om de relaterar till en befintlig app är det vettigt att samla dem där; annars kan de läggas till i en ny app. När en Django-app läggs till i <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>, görs alla taggar som den definierar på den konventionella plats som beskrivs nedan automatiskt tillgängliga för laddning i mallar.</p>\n<p>Appen bör innehålla en katalog med namnet <code class=\"docutils literal notranslate\"><span class=\"pre\">templatetags</span></code>, på samma nivå som <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">views.py</span></code> osv. Om den inte redan finns, skapa den - glöm inte filen <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__.py</span></code> för att se till att katalogen behandlas som ett Python-paket.</p>\n<aside class=\"admonition-development-server-won-t-automatically-restart admonition\">\n<p class=\"admonition-title\">Utvecklingsservern startar inte om automatiskt</p>\n<p>När du har lagt till modulen <code class=\"docutils literal notranslate\"><span class=\"pre\">templatetags</span></code> måste du starta om servern innan du kan använda taggarna eller filtren i mallarna.</p>\n</aside>\n<p>Dina anpassade taggar och filter kommer att finnas i en modul i katalogen <code class=\"docutils literal notranslate\"><span class=\"pre\">templatetags</span></code>. Namnet på modulfilen är det namn som du använder för att ladda taggarna senare, så var noga med att välja ett namn som inte krockar med anpassade taggar och filter i en annan app.</p>\n<p>Om dina anpassade taggar/filter till exempel finns i en fil som heter <code class=\"docutils literal notranslate\"><span class=\"pre\">poll_extras.py</span></code>, kan din applayout se ut så här:</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>polls/\n    __init__.py\n    models.py\n    templatetags/\n        __init__.py\n        poll_extras.py\n    views.py\n</code></pre></div>\n<p>Och i din mall skulle du använda följande:</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\">poll_extras</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Appen som innehåller de anpassade taggarna måste finnas i <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> för att taggen <a class=\"reference internal\" href=\"/sv/5.2/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">%}</span></code></a> ska fungera. Detta är en säkerhetsfunktion: Det gör att du kan vara värd för Python-kod för många mallbibliotek på en enda värdmaskin utan att aktivera åtkomst till dem alla för varje Django-installation.</p>\n<p>Det finns ingen gräns för hur många moduler du lägger in i paketet <code class=\"docutils literal notranslate\"><span class=\"pre\">templatetags</span></code>. Tänk bara på att en <a class=\"reference internal\" href=\"/sv/5.2/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">%}</span></code></a>-sats kommer att ladda taggar/filter för det angivna Python-modulnamnet, inte namnet på appen.</p>\n<p>För att vara ett giltigt taggbibliotek måste modulen innehålla en variabel på modulnivå som heter <code class=\"docutils literal notranslate\"><span class=\"pre\">register</span></code> som är en <code class=\"docutils literal notranslate\"><span class=\"pre\">template.Library</span></code>-instans, där alla taggar och filter registreras. Så, nära toppen av din modul, lägg till 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</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">template</span>\n\n<span class=\"n\">register</span> <span class=\"o\">=</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Library</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Alternativt kan malltaggmoduler registreras via argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">'libraries'</span></code> till <a class=\"reference internal\" href=\"/sv/5.2/topics/templates/#django.template.backends.django.DjangoTemplates\" title=\"django.template.backends.django.DjangoTemplates\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DjangoTemplates</span></code></a>. Detta är användbart om du vill använda en annan etikett än namnet på template-taggmodulen när du laddar template-taggar. Det gör det också möjligt för dig att registrera taggar utan att installera en applikation.</p>\n<aside class=\"admonition-behind-the-scenes admonition\">\n<p class=\"admonition-title\">Bakom kulisserna</p>\n<p>För massor av exempel, läs källkoden för Djangos standardfilter och taggar. De finns i <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/5.2.x/django/template/defaultfilters.py\">django/template/defaultfilters.py</a> respektive <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/5.2.x/django/template/defaulttags.py\">django/template/defaulttags.py</a>.</p>\n<p>För mer information om taggen <a class=\"reference internal\" href=\"/sv/5.2/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">load</span></code></a>, läs dess dokumentation.</p>\n</aside>\n</section>\n<section id=\"writing-custom-template-filters\">\n<span id=\"howto-writing-custom-template-filters\"></span><h2>Skriva anpassade mallfilter<a class=\"heading-anchor\" href=\"#writing-custom-template-filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Anpassade filter är Python-funktioner som tar ett eller två argument:</p>\n<ul class=\"simple\">\n<li><p>Värdet på variabeln (input) - inte nödvändigtvis en sträng.</p></li>\n<li><p>Argumentets värde - detta kan ha ett standardvärde eller utelämnas helt och hållet.</p></li>\n</ul>\n<p>I filtret <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">var|foo:&quot;bar&quot;</span> <span class=\"pre\">}}</span></code> får till exempel filtret <code class=\"docutils literal notranslate\"><span class=\"pre\">foo</span></code> variabeln <code class=\"docutils literal notranslate\"><span class=\"pre\">var</span></code> och argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;bar&quot;</span></code>.</p>\n<p>Eftersom mallspråket inte tillhandahåller undantagshantering kommer alla undantag som skapas av ett mallfilter att exponeras som ett serverfel. Därför bör filterfunktioner undvika att skapa undantag om det finns ett rimligt fallback-värde att returnera. När det gäller indata som representerar en tydlig bugg i en mall kan det fortfarande vara bättre att skapa ett undantag än ett tyst misslyckande som döljer buggen.</p>\n<p>Här är ett exempel på en filterdefinition:</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\">cut</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">arg</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;Removes all values of arg from the given string&quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"n\">arg</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Och här är ett exempel på hur det filtret skulle kunna användas:</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\">somevariable</span><span class=\"o\">|</span><span class=\"nf\">cut</span><span class=\"s2\">:&quot;0&quot;</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>De flesta filter tar inte emot argument. I detta fall, lämna argumentet utanför din funktion:</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\">lower</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">):</span>  <span class=\"c1\"># Only one argument.</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;Converts a string into all lowercase&quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">()</span>\n</code></pre></div>\n<section id=\"registering-custom-filters\">\n<h3>Registrering av anpassade filter<a class=\"heading-anchor\" href=\"#registering-custom-filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.template.Library.filter\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.template.Library.</span></span><span class=\"sig-name descname\"><span class=\"pre\">filter</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.Library.filter\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>När du har skrivit din filterdefinition måste du registrera den med din <code class=\"docutils literal notranslate\"><span class=\"pre\">Library</span></code>-instans för att göra den tillgänglig för Djangos mallspråk:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">register</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"s2\">&quot;cut&quot;</span><span class=\"p\">,</span> <span class=\"n\">cut</span><span class=\"p\">)</span>\n<span class=\"n\">register</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"s2\">&quot;lower&quot;</span><span class=\"p\">,</span> <span class=\"n\">lower</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">Library.filter()</span></code> tar två argument:</p>\n<ol class=\"arabic simple\">\n<li><p>Filtrets namn - en sträng.</p></li>\n<li><p>Kompileringsfunktionen – en Python-funktion (inte namnet på funktionen som en sträng).</p></li>\n</ol>\n<p>Du kan använda <code class=\"docutils literal notranslate\"><span class=\"pre\">register.filter()</span></code> som en dekorator istället:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;cut&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">cut</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">arg</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">replace</span><span class=\"p\">(</span><span class=\"n\">arg</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">filter</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">lower</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Om du utelämnar argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>, som i det andra exemplet ovan, kommer Django att använda funktionens namn som filternamn.</p>\n<p>Slutligen accepterar <code class=\"docutils literal notranslate\"><span class=\"pre\">register.filter()</span></code> också tre nyckelordsargument, <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">needs_autoescape</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">expects_localtime</span></code>. Dessa argument beskrivs i <a class=\"reference internal\" href=\"#filters-auto-escaping\"><span class=\"std std-ref\">filter och auto-escaping</span></a> och <a class=\"reference internal\" href=\"#filters-timezones\"><span class=\"std std-ref\">filter och tidszoner</span></a> nedan.</p>\n</section>\n<section id=\"template-filters-that-expect-strings\">\n<h3>Mallfilter som förväntar sig strängar<a class=\"heading-anchor\" href=\"#template-filters-that-expect-strings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.template.defaultfilters.stringfilter\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.template.defaultfilters.</span></span><span class=\"sig-name descname\"><span class=\"pre\">stringfilter</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.defaultfilters.stringfilter\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Om du skriver ett mallfilter som bara förväntar sig en sträng som första argument, bör du använda dekoratorn <code class=\"docutils literal notranslate\"><span class=\"pre\">stringfilter</span></code>. Detta kommer att konvertera ett objekt till dess strängvärde innan det skickas till din funktion:</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</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">template</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template.defaultfilters</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">stringfilter</span>\n\n<span class=\"n\">register</span> <span class=\"o\">=</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Library</span><span class=\"p\">()</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">filter</span>\n<span class=\"nd\">@stringfilter</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">lower</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>På så sätt kan du skicka t.ex. ett heltal till detta filter utan att det orsakar ett <code class=\"docutils literal notranslate\"><span class=\"pre\">AttributeError</span></code> (eftersom heltal inte har <code class=\"docutils literal notranslate\"><span class=\"pre\">lower()</span></code>-metoder).</p>\n</section>\n<section id=\"filters-and-auto-escaping\">\n<span id=\"filters-auto-escaping\"></span><h3>Filter och automatisk särskrivning<a class=\"heading-anchor\" href=\"#filters-and-auto-escaping\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>När du skriver ett anpassat filter, tänk på hur filtret kommer att interagera med Djangos auto-escaping-beteende. Observera att två typer av strängar kan skickas runt inuti mallkoden:</p>\n<ul>\n<li><p><strong>Raw strings</strong> är de ursprungliga Python-strängarna. Vid utmatning escapas de om automatisk escaping är i bruk och presenteras annars oförändrade.</p></li>\n<li><p><strong>Säkra strängar</strong> är strängar som har markerats som säkra från ytterligare escaping vid utmatningstillfället. All nödvändig escaping har redan gjorts. De används ofta för utdata som innehåller rå HTML som är avsedd att tolkas som den är på klientsidan.</p>\n<p>Internt är dessa strängar av typen <a class=\"reference internal\" href=\"/sv/5.2/ref/utils/#django.utils.safestring.SafeString\" title=\"django.utils.safestring.SafeString\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SafeString</span></code></a>. Du kan testa för dem med hjälp av kod som:</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.utils.safestring</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SafeString</span>\n\n<span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">SafeString</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Do something with the &quot;safe&quot; string.</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</li>\n</ul>\n<p>Mallfilterkod faller i en av två situationer:</p>\n<ol class=\"arabic\">\n<li><p>Ditt filter introducerar inte några HTML-osäkra tecken (<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&gt;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;</span></code>) i resultatet som inte redan fanns. I det här fallet kan du låta Django ta hand om all hantering av automatisk eskapning åt dig. Allt du behöver göra är att ställa in flaggan <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> när du registrerar din filterfunktion, 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=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">is_safe</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">myfilter</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">value</span>\n</code></pre></div>\n<p>Denna flagga talar om för Django att om en ”säker” sträng skickas in i ditt filter, kommer resultatet fortfarande att vara ”säkert” och om en icke-säker sträng skickas in, kommer Django automatiskt att undkomma den, om det behövs.</p>\n<p>Du kan tänka dig att detta betyder ”det här filtret är säkert - det introducerar inte någon möjlighet till osäker HTML”</p>\n<p>Anledningen till att <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code> är nödvändig är att det finns gott om normala strängoperationer som kommer att göra ett <code class=\"docutils literal notranslate\"><span class=\"pre\">SafeData</span></code>-objekt tillbaka till ett normalt <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code>-objekt och i stället för att försöka fånga dem alla, vilket skulle vara mycket svårt, reparerar Django skadan efter att filtret har slutförts.</p>\n<p>Anta till exempel att du har ett filter som lägger till strängen <code class=\"docutils literal notranslate\"><span class=\"pre\">xx</span></code> i slutet av alla inmatningar. Eftersom detta inte tillför några farliga HTML-tecken till resultatet (förutom de som redan fanns där), bör du markera ditt filter med <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">is_safe</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">add_xx</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">xx&quot;</span> <span class=\"o\">%</span> <span class=\"n\">value</span>\n</code></pre></div>\n<p>När detta filter används i en mall där automatisk escaping är aktiverad, kommer Django att escapa utdata när indata inte redan är markerad som ”säker”.</p>\n<p>Som standard är <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code> <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, och du kan utelämna det från alla filter där det inte krävs.</p>\n<p>Var försiktig när du avgör om ditt filter verkligen lämnar säkra strängar som säkra. Om du <em>tar bort</em> tecken kan du oavsiktligt lämna obalanserade HTML-taggar eller enheter i resultatet. Om du till exempel tar bort en <code class=\"docutils literal notranslate\"><span class=\"pre\">&gt;</span></code> från indata kan <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;a&gt;</span></code> bli <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;a</span></code>, som måste escapas i utdata för att inte orsaka problem. På samma sätt kan borttagning av ett semikolon (<code class=\"docutils literal notranslate\"><span class=\"pre\">;</span></code>) förvandla <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;amp;</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;amp;amp</span></code>, som inte längre är en giltig enhet och därför behöver ytterligare escaping. De flesta fall kommer inte att vara så här knepiga, men håll utkik efter sådana problem när du granskar din kod.</p>\n<p>Om du markerar ett filter med <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code> kommer filtrets returvärde att tvingas till en sträng.  Om ditt filter ska returnera ett booleskt värde eller ett annat värde som inte är en sträng, kommer markeringen <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code> förmodligen att få oavsiktliga konsekvenser (t.ex. konvertering av ett booleskt värde False till strängen ’False’).</p>\n</li>\n<li><p>Alternativt kan din filterkod manuellt ta hand om all nödvändig escaping. Detta är nödvändigt när du introducerar ny HTML-markup i resultatet. Du vill markera utdata som säker från ytterligare escaping så att din HTML-markering inte escapas ytterligare, så du måste hantera inmatningen själv.</p>\n<p>För att markera utdata som en säker sträng, använd <a class=\"reference internal\" href=\"/sv/5.2/ref/utils/#django.utils.safestring.mark_safe\" title=\"django.utils.safestring.mark_safe\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.safestring.mark_safe()</span></code></a>.</p>\n<p>Var dock försiktig. Du behöver göra mer än att bara markera utdata som säker. Du måste se till att det verkligen <em>är</em> säkert, och vad du gör beror på om auto-escaping är i kraft. Tanken är att skriva filter som kan fungera i mallar där auto-escaping är antingen på eller av för att göra saker enklare för dina mallförfattare.</p>\n<p>För att ditt filter ska känna till det aktuella auto-escaping-läget ska du ställa in flaggan <code class=\"docutils literal notranslate\"><span class=\"pre\">needs_autoescape</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> när du registrerar din filterfunktion. (Om du inte anger den här flaggan är standardvärdet <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>). Denna flagga talar om för Django att din filterfunktion vill få ett extra nyckelordsargument, kallat <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape</span></code>, som är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> om auto-escaping är i kraft och <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> annars. Det rekommenderas att ställa in standardvärdet för parametern <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, så att om du anropar funktionen från Python-kod kommer den att ha escaping aktiverad som standard.</p>\n<p>Låt oss t.ex. skriva ett filter som betonar det första tecknet i en sträng:</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</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">template</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.html</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">conditional_escape</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.safestring</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">mark_safe</span>\n\n<span class=\"n\">register</span> <span class=\"o\">=</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Library</span><span class=\"p\">()</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">needs_autoescape</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">initial_letter_filter</span><span class=\"p\">(</span><span class=\"n\">text</span><span class=\"p\">,</span> <span class=\"n\">autoescape</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n    <span class=\"n\">first</span><span class=\"p\">,</span> <span class=\"n\">other</span> <span class=\"o\">=</span> <span class=\"n\">text</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"n\">text</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:]</span>\n    <span class=\"k\">if</span> <span class=\"n\">autoescape</span><span class=\"p\">:</span>\n        <span class=\"n\">esc</span> <span class=\"o\">=</span> <span class=\"n\">conditional_escape</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">esc</span> <span class=\"o\">=</span> <span class=\"k\">lambda</span> <span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">x</span>\n    <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;&lt;strong&gt;</span><span class=\"si\">%s</span><span class=\"s2\">&lt;/strong&gt;</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">esc</span><span class=\"p\">(</span><span class=\"n\">first</span><span class=\"p\">),</span> <span class=\"n\">esc</span><span class=\"p\">(</span><span class=\"n\">other</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">mark_safe</span><span class=\"p\">(</span><span class=\"n\">result</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Flaggan <code class=\"docutils literal notranslate\"><span class=\"pre\">needs_autoescape</span></code> och nyckelordsargumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape</span></code> innebär att vår funktion kommer att veta om automatisk escaping är i kraft när filtret anropas. Vi använder <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape</span></code> för att avgöra om indata behöver skickas genom <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.html.conditional_escape</span></code> eller inte. (I det senare fallet använder vi identitetsfunktionen som ”escape”-funktion.) Funktionen <code class=\"docutils literal notranslate\"><span class=\"pre\">conditional_escape()</span></code> är som <code class=\"docutils literal notranslate\"><span class=\"pre\">escape()</span></code> förutom att den bara escaper indata som <strong>inte</strong> är en <code class=\"docutils literal notranslate\"><span class=\"pre\">SafeData</span></code>-instans. Om en <code class=\"docutils literal notranslate\"><span class=\"pre\">SafeData</span></code>-instans skickas till <code class=\"docutils literal notranslate\"><span class=\"pre\">conditional_escape()</span></code> returneras data oförändrat.</p>\n<p>Slutligen, i exemplet ovan, kommer vi ihåg att markera resultatet som säkert så att vår HTML infogas direkt i mallen utan ytterligare escaping.</p>\n<p>Det finns ingen anledning att oroa sig för flaggan <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code> i det här fallet (även om det inte skulle skada något att inkludera den). När du manuellt hanterar auto-escaping-problemen och returnerar en säker sträng, kommer <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code>-flaggan inte att ändra någonting på något sätt.</p>\n</li>\n</ol>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Undvik XSS-sårbarheter när du återanvänder inbyggda filter</p>\n<p>Djangos inbyggda filter har <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape=True</span></code> som standard för att få rätt autoescaping-beteende och undvika en cross-site script-sårbarhet.</p>\n<p>I äldre versioner av Django bör du vara försiktig när du återanvänder Djangos inbyggda filter eftersom <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape</span></code> som standard är <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. Du måste skicka <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape=True</span></code> för att få autoescaping.</p>\n<p>Om du till exempel vill skriva ett anpassat filter som heter <code class=\"docutils literal notranslate\"><span class=\"pre\">urlize_and_linebreaks</span></code> och som kombinerar filtren <code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">urlize`</span></code> och <code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">linebreaksbr`</span></code>, skulle filtret se ut på följande sätt:</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.template.defaultfilters</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">linebreaksbr</span><span class=\"p\">,</span> <span class=\"n\">urlize</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">needs_autoescape</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">urlize_and_linebreaks</span><span class=\"p\">(</span><span class=\"n\">text</span><span class=\"p\">,</span> <span class=\"n\">autoescape</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">linebreaksbr</span><span class=\"p\">(</span><span class=\"n\">urlize</span><span class=\"p\">(</span><span class=\"n\">text</span><span class=\"p\">,</span> <span class=\"n\">autoescape</span><span class=\"o\">=</span><span class=\"n\">autoescape</span><span class=\"p\">),</span> <span class=\"n\">autoescape</span><span class=\"o\">=</span><span class=\"n\">autoescape</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Då så:</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\">comment</span><span class=\"o\">|</span><span class=\"nf\">urlize_and_linebreaks</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>skulle motsvara:</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\">comment</span><span class=\"o\">|</span><span class=\"nf\">urlize</span><span class=\"o\">|</span><span class=\"nf\">linebreaksbr</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"filters-and-time-zones\">\n<span id=\"filters-timezones\"></span><h3>Filter och tidszoner<a class=\"heading-anchor\" href=\"#filters-and-time-zones\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om du skriver ett anpassat filter som fungerar på <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime</span></code></a>-objekt, registrerar du det vanligtvis med flaggan <code class=\"docutils literal notranslate\"><span class=\"pre\">expects_localtime</span></code> inställd på <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">expects_localtime</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">businesshours</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"mi\">9</span> <span class=\"o\">&lt;=</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">hour</span> <span class=\"o\">&lt;</span> <span class=\"mi\">17</span>\n    <span class=\"k\">except</span> <span class=\"ne\">AttributeError</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;&quot;</span>\n</code></pre></div>\n<p>När denna flagga är inställd, om det första argumentet till ditt filter är en tidszonmedveten datatid, kommer Django att konvertera den till den aktuella tidszonen innan den skickas till ditt filter när det är lämpligt, enligt <a class=\"reference internal\" href=\"/sv/5.2/topics/i18n/timezones/#time-zones-in-templates\"><span class=\"std std-ref\">regler för tidszonkonverteringar i mallar</span></a>.</p>\n</section>\n</section>\n<section id=\"writing-custom-template-tags\">\n<span id=\"howto-writing-custom-template-tags\"></span><h2>Skriva anpassade malltaggar<a class=\"heading-anchor\" href=\"#writing-custom-template-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Taggar är mer komplexa än filter, eftersom taggar kan göra vad som helst. Django tillhandahåller ett antal genvägar som gör det enklare att skriva de flesta typer av taggar. Först ska vi utforska dessa genvägar och sedan förklara hur man skriver en tagg från grunden för de fall då genvägarna inte är tillräckligt kraftfulla.</p>\n<section id=\"simple-tags\">\n<span id=\"howto-custom-template-tags-simple-tags\"></span><h3>Enkla taggar<a class=\"heading-anchor\" href=\"#simple-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.template.Library.simple_tag\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.template.Library.</span></span><span class=\"sig-name descname\"><span class=\"pre\">simple_tag</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.Library.simple_tag\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Många malltaggar tar emot ett antal argument - strängar eller mallvariabler - och returnerar ett resultat efter att ha gjort en viss bearbetning baserad enbart på inmatningsargumenten och viss extern information. Till exempel kan en <code class=\"docutils literal notranslate\"><span class=\"pre\">current_time</span></code>-tagg acceptera en formatsträng och returnera tiden som en sträng formaterad i enlighet med detta.</p>\n<p>För att underlätta skapandet av dessa typer av taggar tillhandahåller Django en hjälpfunktion, <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_tag</span></code>. Denna funktion, som är en metod för <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.Library</span></code>, tar en funktion som accepterar valfritt antal argument, sveper in den i en <code class=\"docutils literal notranslate\"><span class=\"pre\">render</span></code>-funktion och de andra nödvändiga bitarna som nämns ovan och registrerar den med mallsystemet.</p>\n<p>Vår funktion <code class=\"docutils literal notranslate\"><span class=\"pre\">current_time</span></code> kan alltså skrivas 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\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">template</span>\n\n<span class=\"n\">register</span> <span class=\"o\">=</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Library</span><span class=\"p\">()</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">simple_tag</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">current_time</span><span class=\"p\">(</span><span class=\"n\">format_string</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"n\">format_string</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Några saker att notera om hjälpfunktionen <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_tag</span></code>:</p>\n<ul class=\"simple\">\n<li><p>Kontrollen av det nödvändiga antalet argument etc. har redan gjorts när vår funktion anropas, så vi behöver inte göra det.</p></li>\n<li><p>Citaten runt argumentet (om sådana finns) har redan tagits bort, så vi får en vanlig sträng.</p></li>\n<li><p>Om argumentet var en mallvariabel skickas variabelns aktuella värde till vår funktion, inte variabeln i sig.</p></li>\n</ul>\n<p>Till skillnad från andra taggverktyg skickar <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_tag</span></code> sin utdata genom <a class=\"reference internal\" href=\"/sv/5.2/ref/utils/#django.utils.html.conditional_escape\" title=\"django.utils.html.conditional_escape\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">conditional_escape()</span></code></a> om mallkontexten är i autoescape-läge, för att säkerställa korrekt HTML och skydda dig från XSS-sårbarheter.</p>\n<p>Om ytterligare escaping inte är önskvärt måste du använda <a class=\"reference internal\" href=\"/sv/5.2/ref/utils/#django.utils.safestring.mark_safe\" title=\"django.utils.safestring.mark_safe\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">mark_safe()</span></code></a> om du är helt säker på att din kod inte innehåller XSS-sårbarheter. För att bygga små HTML-snuttar rekommenderas starkt att använda <a class=\"reference internal\" href=\"/sv/5.2/ref/utils/#django.utils.html.format_html\" title=\"django.utils.html.format_html\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">format_html()</span></code></a> istället för <code class=\"docutils literal notranslate\"><span class=\"pre\">mark_safe()</span></code>.</p>\n<p>Om din malltagg behöver komma åt den aktuella kontexten kan du använda argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context</span></code> när du registrerar din tagg:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">simple_tag</span><span class=\"p\">(</span><span class=\"n\">takes_context</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">current_time</span><span class=\"p\">(</span><span class=\"n\">context</span><span class=\"p\">,</span> <span class=\"n\">format_string</span><span class=\"p\">):</span>\n    <span class=\"n\">timezone</span> <span class=\"o\">=</span> <span class=\"n\">context</span><span class=\"p\">[</span><span class=\"s2\">&quot;timezone&quot;</span><span class=\"p\">]</span>\n    <span class=\"k\">return</span> <span class=\"n\">your_get_current_time_method</span><span class=\"p\">(</span><span class=\"n\">timezone</span><span class=\"p\">,</span> <span class=\"n\">format_string</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Observera att det första argumentet <em>måste</em> heta <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code>.</p>\n<p>För mer information om hur alternativet <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context</span></code> fungerar, se avsnittet om <a class=\"reference internal\" href=\"#howto-custom-template-tags-inclusion-tags\"><span class=\"std std-ref\">inclusion tags</span></a>.</p>\n<p>Om du behöver byta namn på din tagg kan du ange ett eget namn för den:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">register</span><span class=\"o\">.</span><span class=\"n\">simple_tag</span><span class=\"p\">(</span><span class=\"k\">lambda</span> <span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">x</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;minusone&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">simple_tag</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;minustwo&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">some_function</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">value</span> <span class=\"o\">-</span> <span class=\"mi\">2</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">simple_tag</span></code>-funktioner kan acceptera valfritt antal positionella eller nyckelordsargument. Till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">simple_tag</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_tag</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"n\">warning</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;warning&quot;</span><span class=\"p\">]</span>\n    <span class=\"n\">profile</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;profile&quot;</span><span class=\"p\">]</span>\n    <span class=\"o\">...</span>\n    <span class=\"k\">return</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>I mallen kan sedan valfritt antal argument, åtskilda med mellanslag, skickas till malltaggen. Precis som i Python anges värdena för nyckelordsargument med hjälp av likhetstecknet (”<code class=\"docutils literal notranslate\"><span class=\"pre\">=</span></code>”) och måste anges efter de positionella argumenten. Till exempel:</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\">my_tag</span> <span class=\"m\">123</span> <span class=\"s2\">&quot;abcd&quot;</span> <span class=\"nv\">book.title</span> <span class=\"nv\">warning</span><span class=\"o\">=</span><span class=\"nv\">message</span><span class=\"o\">|</span><span class=\"nf\">lower</span> <span class=\"nv\">profile</span><span class=\"o\">=</span><span class=\"nv\">user.profile</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Det är möjligt att lagra taggresultaten i en mallvariabel i stället för att skriva ut dem direkt. Detta görs genom att använda argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">as</span></code> följt av variabelnamnet. På så sätt kan du själv mata ut innehållet där du tycker att det passar:</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\">current_time</span> <span class=\"s2\">&quot;%Y-%m-%d %I:%M %p&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">the_time</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>The time is <span class=\"cp\">{{</span> <span class=\"nv\">the_time</span> <span class=\"cp\">}}</span>.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"simple-block-tags\">\n<span id=\"howto-custom-template-tags-simple-block-tags\"></span><h3>Enkla block-taggar<a class=\"heading-anchor\" href=\"#simple-block-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"5.2\">\n<p class=\"version-note-title\">New in Django 5.2</p></aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.template.Library.simple_block_tag\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.template.Library.</span></span><span class=\"sig-name descname\"><span class=\"pre\">simple_block_tag</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.Library.simple_block_tag\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>När ett avsnitt av en renderad mall behöver skickas in i en anpassad tagg tillhandahåller Django hjälpfunktionen <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_block_tag</span></code> för att åstadkomma detta. I likhet med <a class=\"reference internal\" href=\"#django.template.Library.simple_tag\" title=\"django.template.Library.simple_tag\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">simple_tag()</span></code></a> accepterar den här funktionen en anpassad taggfunktion, men med det extra argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code>, som innehåller det återgivna innehållet som definieras inuti taggen. Detta gör att dynamiska mallavsnitt enkelt kan införlivas i anpassade taggar.</p>\n<p>Till exempel kan en anpassad blocktagg som skapar ett diagram se ut så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">template</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.charts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render_chart</span>\n\n<span class=\"n\">register</span> <span class=\"o\">=</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Library</span><span class=\"p\">()</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">simple_block_tag</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">chart</span><span class=\"p\">(</span><span class=\"n\">content</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">render_chart</span><span class=\"p\">(</span><span class=\"n\">source</span><span class=\"o\">=</span><span class=\"n\">content</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code> innehåller allt mellan taggarna <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">chart</span> <span class=\"pre\">%}</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endchart</span> <span class=\"pre\">%}</span></code>:</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\">chart</span> <span class=\"cp\">%}</span>\n  digraph G {\n      label = &quot;Chart for <span class=\"cp\">{{</span> <span class=\"nv\">request.user</span> <span class=\"cp\">}}</span>&quot;\n      A -&gt; {B C}\n  }\n<span class=\"cp\">{%</span> <span class=\"k\">endchart</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Om det finns andra malltaggar eller variabler i <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code>-blocket kommer de att renderas innan de skickas till taggfunktionen. I exemplet ovan kommer <code class=\"docutils literal notranslate\"><span class=\"pre\">request.user</span></code> att vara löst när <code class=\"docutils literal notranslate\"><span class=\"pre\">render_chart</span></code> anropas.</p>\n<p>Blocktaggar avslutas med <code class=\"docutils literal notranslate\"><span class=\"pre\">end{name}</span></code> (t.ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">endchart</span></code>). Detta kan anpassas med parametern <code class=\"docutils literal notranslate\"><span class=\"pre\">end_name</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">simple_block_tag</span><span class=\"p\">(</span><span class=\"n\">end_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;endofchart&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">chart</span><span class=\"p\">(</span><span class=\"n\">content</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">render_chart</span><span class=\"p\">(</span><span class=\"n\">source</span><span class=\"o\">=</span><span class=\"n\">content</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Vilket skulle kräva en malldefinition som denna:</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\">chart</span> <span class=\"cp\">%}</span>\n  digraph G {\n      label = &quot;Chart for <span class=\"cp\">{{</span> <span class=\"nv\">request.user</span> <span class=\"cp\">}}</span>&quot;\n      A -&gt; {B C}\n  }\n<span class=\"cp\">{%</span> <span class=\"k\">endofchart</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Några saker att notera om <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_block_tag</span></code>:</p>\n<ul class=\"simple\">\n<li><p>Det första argumentet måste heta <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code>, och det kommer att innehålla innehållet i malltaggen som en renderad sträng.</p></li>\n<li><p>Variabler som skickas till taggen inkluderas inte i innehållets renderingskontext, vilket skulle vara fallet om man använde taggen <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">with</span> <span class=\"pre\">%}</span></code>.</p></li>\n</ul>\n<p>Precis som <a class=\"reference internal\" href=\"#howto-custom-template-tags-simple-tags\"><span class=\"std std-ref\">simple_tag</span></a>, <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_block_tag</span></code>:</p>\n<ul class=\"simple\">\n<li><p>Validerar kvantiteten och kvaliteten på argumenten.</p></li>\n<li><p>Tar bort citat från argumenten om det behövs.</p></li>\n<li><p>Undviker utgången i enlighet med detta.</p></li>\n<li><p>Stöder passering av <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context=True</span></code> vid registreringstillfället för att komma åt kontexten. Observera att i det här fallet måste det första argumentet till den anpassade funktionen <em>mås</em> kallas <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code> måste följa efter.</p></li>\n<li><p>Stöder att byta namn på taggen genom att skicka argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> vid registrering.</p></li>\n<li><p>Accepterar valfritt antal positionella argument eller nyckelordsargument.</p></li>\n<li><p>Stöder lagring av resultatet i en mallvariabel med hjälp av <code class=\"docutils literal notranslate\"><span class=\"pre\">as</span></code>-varianten.</p></li>\n</ul>\n<aside class=\"admonition-content-escaping admonition\">\n<p class=\"admonition-title\">Innehåll som undkommer</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">simple_block_tag</span></code> beter sig på liknande sätt som <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_tag</span></code> när det gäller automatisk escaping. För detaljer om escaping och säkerhet, se <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_tag</span></code>. Eftersom argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code> redan har återgivits av Django, är det redan escapat.</p>\n</aside>\n<section id=\"a-complete-example\">\n<h4>Ett komplett exempel<a class=\"heading-anchor\" href=\"#a-complete-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Tänk dig en anpassad malltagg som genererar en meddelanderuta som stöder flera meddelandenivåer och innehåll utöver en enkel fras. Detta kan implementeras med hjälp av en <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_block_tag</span></code> enligt följande:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">testapp/templatetags/testapptags.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">template</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.html</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">format_html</span>\n\n<span class=\"n\">register</span> <span class=\"o\">=</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Library</span><span class=\"p\">()</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">simple_block_tag</span><span class=\"p\">(</span><span class=\"n\">takes_context</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">msgbox</span><span class=\"p\">(</span><span class=\"n\">context</span><span class=\"p\">,</span> <span class=\"n\">content</span><span class=\"p\">,</span> <span class=\"n\">level</span><span class=\"p\">):</span>\n    <span class=\"n\">format_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"n\">level</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">(),</span>\n        <span class=\"s2\">&quot;level_title&quot;</span><span class=\"p\">:</span> <span class=\"n\">level</span><span class=\"o\">.</span><span class=\"n\">capitalize</span><span class=\"p\">(),</span>\n        <span class=\"s2\">&quot;content&quot;</span><span class=\"p\">:</span> <span class=\"n\">content</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;open&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot; open&quot;</span> <span class=\"k\">if</span> <span class=\"n\">level</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">()</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;error&quot;</span> <span class=\"k\">else</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;site&quot;</span><span class=\"p\">:</span> <span class=\"n\">context</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;site&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;My Site&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">}</span>\n    <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;&quot;&quot;</span>\n<span class=\"s2\">    &lt;div class=&quot;msgbox </span><span class=\"si\">{level}</span><span class=\"s2\">&quot;&gt;</span>\n<span class=\"s2\">      &lt;details</span><span class=\"si\">{open}</span><span class=\"s2\">&gt;</span>\n<span class=\"s2\">        &lt;summary&gt;</span>\n<span class=\"s2\">          &lt;strong&gt;</span><span class=\"si\">{level_title}</span><span class=\"s2\">&lt;/strong&gt;: Please read for &lt;i&gt;</span><span class=\"si\">{site}</span><span class=\"s2\">&lt;/i&gt;</span>\n<span class=\"s2\">        &lt;/summary&gt;</span>\n<span class=\"s2\">        &lt;p&gt;</span>\n<span class=\"s2\">          </span><span class=\"si\">{content}</span>\n<span class=\"s2\">        &lt;/p&gt;</span>\n<span class=\"s2\">      &lt;/details&gt;</span>\n<span class=\"s2\">    &lt;/div&gt;</span>\n<span class=\"s2\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"n\">format_html</span><span class=\"p\">(</span><span class=\"n\">result</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">format_kwargs</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>I kombination med en minimal vy och motsvarande mall, som visas här:</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\">testapp/views.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">simpleblocktag_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s2\">&quot;test.html&quot;</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;site&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Important Site&quot;</span><span class=\"p\">})</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">testapp/templates/test.html</span></code> <code class=\"docutils literal notranslate\"><span class=\"pre\">testapp/templates/test.html</span></code></figcaption>\n<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\">load</span> <span class=\"nv\">testapptags</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  <span class=\"cp\">{%</span> <span class=\"k\">msgbox</span> <span class=\"nv\">level</span><span class=\"o\">=</span><span class=\"s2\">&quot;error&quot;</span> <span class=\"cp\">%}</span>\n    Please fix all errors. Further documentation can be found at\n    <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;http://example.com&quot;</span><span class=\"p\">&gt;</span>Docs<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>.\n  <span class=\"cp\">{%</span> <span class=\"k\">endmsgbox</span> <span class=\"cp\">%}</span>\n\n  <span class=\"cp\">{%</span> <span class=\"k\">msgbox</span> <span class=\"nv\">level</span><span class=\"o\">=</span><span class=\"s2\">&quot;info&quot;</span> <span class=\"cp\">%}</span>\n    More information at: <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;http://othersite.com&quot;</span><span class=\"p\">&gt;</span>Other Site<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>/\n  <span class=\"cp\">{%</span> <span class=\"k\">endmsgbox</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></figure>\n<p>Följande HTML visas som renderad utdata:</p>\n<div class=\"code-block\" data-language=\"html\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Html</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=\"Html code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;msgbox error&quot;</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">details</span> <span class=\"na\">open</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">summary</span><span class=\"p\">&gt;</span>\n      <span class=\"p\">&lt;</span><span class=\"nt\">strong</span><span class=\"p\">&gt;</span>Error<span class=\"p\">&lt;/</span><span class=\"nt\">strong</span><span class=\"p\">&gt;</span>: Please read for <span class=\"p\">&lt;</span><span class=\"nt\">i</span><span class=\"p\">&gt;</span>Important Site<span class=\"p\">&lt;/</span><span class=\"nt\">i</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">summary</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n      Please fix all errors. Further documentation can be found at\n      <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;http://example.com&quot;</span><span class=\"p\">&gt;</span>Docs<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>.\n    <span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;/</span><span class=\"nt\">details</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;msgbox info&quot;</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">details</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">summary</span><span class=\"p\">&gt;</span>\n      <span class=\"p\">&lt;</span><span class=\"nt\">strong</span><span class=\"p\">&gt;</span>Info<span class=\"p\">&lt;/</span><span class=\"nt\">strong</span><span class=\"p\">&gt;</span>: Please read for <span class=\"p\">&lt;</span><span class=\"nt\">i</span><span class=\"p\">&gt;</span>Important Site<span class=\"p\">&lt;/</span><span class=\"nt\">i</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">summary</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n      More information at: <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;http://othersite.com&quot;</span><span class=\"p\">&gt;</span>Other Site<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;/</span><span class=\"nt\">details</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"inclusion-tags\">\n<span id=\"howto-custom-template-tags-inclusion-tags\"></span><h3>Taggar för inkludering<a class=\"heading-anchor\" href=\"#inclusion-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.template.Library.inclusion_tag\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.template.Library.</span></span><span class=\"sig-name descname\"><span class=\"pre\">inclusion_tag</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.Library.inclusion_tag\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>En annan vanlig typ av malltagg är den typ som visar vissa data genom att rendera <em>en annan</em> mall. Till exempel använder Djangos admin-gränssnitt anpassade malltaggar för att visa knapparna längst ner på formulärsidorna för ”lägg till/ändra”. Dessa knappar ser alltid likadana ut, men länkmålen ändras beroende på vilket objekt som redigeras - så de är ett perfekt fall för att använda en liten mall som är fylld med detaljer från det aktuella objektet. (I administratörens fall är detta taggen <code class=\"docutils literal notranslate\"><span class=\"pre\">submit_row</span></code>)</p>\n<p>Den här typen av taggar kallas ”inclusion tags”.</p>\n<p>Att skriva inclusion-taggar demonstreras förmodligen bäst med ett exempel. Låt oss skriva en tagg som matar ut en lista med val för ett givet <code class=\"docutils literal notranslate\"><span class=\"pre\">Poll</span></code>-objekt, som skapades i <a class=\"reference internal\" href=\"/sv/5.2/intro/tutorial02/#creating-models\"><span class=\"std std-ref\">tutorials</span></a>. Vi kommer att använda taggen 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\">show_results</span> <span class=\"nv\">poll</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>…och utdata blir ungefär så här:</p>\n<div class=\"code-block\" data-language=\"html\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Html</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=\"Html code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>First choice<span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>Second choice<span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>Third choice<span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Först definierar vi den funktion som tar argumentet och producerar en ordbok med data som resultat. Den viktiga punkten här är att vi bara behöver returnera en ordbok, inte något mer komplext. Detta kommer att användas som en mallkontext för mallfragmentet. 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\">def</span><span class=\"w\"> </span><span class=\"nf\">show_results</span><span class=\"p\">(</span><span class=\"n\">poll</span><span class=\"p\">):</span>\n    <span class=\"n\">choices</span> <span class=\"o\">=</span> <span class=\"n\">poll</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"p\">{</span><span class=\"s2\">&quot;choices&quot;</span><span class=\"p\">:</span> <span class=\"n\">choices</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>Därefter skapar du den mall som används för att rendera taggens utdata. Denna mall är en fast egenskap hos taggen: taggskrivaren specificerar den, inte malldesignern. I vårt exempel är mallen mycket kort:</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=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">choice</span> <span class=\"k\">in</span> <span class=\"nv\">choices</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span> <span class=\"cp\">{{</span> <span class=\"nv\">choice</span> <span class=\"cp\">}}</span> <span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Nu skapar och registrerar du inclusion-taggen genom att anropa metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">inclusion_tag()</span></code> på ett <code class=\"docutils literal notranslate\"><span class=\"pre\">Library</span></code>-objekt. Om vi följer vårt exempel och ovanstående mall finns i en fil som heter <code class=\"docutils literal notranslate\"><span class=\"pre\">results.html</span></code> i en katalog som malladdaren söker i, skulle vi registrera taggen 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=\"c1\"># Here, register is a django.template.Library instance, as before</span>\n<span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">inclusion_tag</span><span class=\"p\">(</span><span class=\"s2\">&quot;results.html&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">show_results</span><span class=\"p\">(</span><span class=\"n\">poll</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Alternativt är det möjligt att registrera inkluderingstaggen med hjälp av en <a class=\"reference internal\" href=\"/sv/5.2/ref/templates/api/#django.template.Template\" title=\"django.template.Template\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.template.Template</span></code></a>-instans:</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.template.loader</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_template</span>\n\n<span class=\"n\">t</span> <span class=\"o\">=</span> <span class=\"n\">get_template</span><span class=\"p\">(</span><span class=\"s2\">&quot;results.html&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">register</span><span class=\"o\">.</span><span class=\"n\">inclusion_tag</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"p\">)(</span><span class=\"n\">show_results</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>…när du först skapade funktionen.</p>\n<p>Ibland kan dina inkluderingstaggar kräva ett stort antal argument, vilket gör det till en smärta för mallförfattare att skicka in alla argument och komma ihåg deras ordning. För att lösa detta tillhandahåller Django ett <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context</span></code>-alternativ för inkluderingstaggar. Om du anger <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context</span></code> när du skapar en malltagg, kommer taggen inte att ha några nödvändiga argument, och den underliggande Python-funktionen kommer att ha ett argument - mallkontexten från och med när taggen anropades.</p>\n<p>Låt oss till exempel säga att du skriver en inclusion-tagg som alltid kommer att användas i ett sammanhang som innehåller variablerna <code class=\"docutils literal notranslate\"><span class=\"pre\">home_link</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">home_title</span></code> som pekar tillbaka till huvudsidan. Så här skulle Python-funktionen se ut:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">inclusion_tag</span><span class=\"p\">(</span><span class=\"s2\">&quot;link.html&quot;</span><span class=\"p\">,</span> <span class=\"n\">takes_context</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">jump_link</span><span class=\"p\">(</span><span class=\"n\">context</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;link&quot;</span><span class=\"p\">:</span> <span class=\"n\">context</span><span class=\"p\">[</span><span class=\"s2\">&quot;home_link&quot;</span><span class=\"p\">],</span>\n        <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> <span class=\"n\">context</span><span class=\"p\">[</span><span class=\"s2\">&quot;home_title&quot;</span><span class=\"p\">],</span>\n    <span class=\"p\">}</span>\n</code></pre></div>\n<p>Observera att den första parametern till funktionen <em>måste</em> heta <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code>.</p>\n<p>I raden <code class=\"docutils literal notranslate\"><span class=\"pre\">register.inclusion_tag()</span></code> angav vi <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context=True</span></code> och namnet på mallen. Så här kan mallen <code class=\"docutils literal notranslate\"><span class=\"pre\">link.html</span></code> se ut:</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>Jump directly to <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">link</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>.\n</code></pre></div>\n<p>När du sedan vill använda den anpassade taggen laddar du dess bibliotek och anropar den utan några argument, till exempel 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\">jump_link</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Observera att när du använder <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context=True</span></code> behöver du inte skicka några argument till malltaggen. Den får automatiskt tillgång till kontexten.</p>\n<p>Parametern <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context</span></code> är som standard inställd på <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. När den är inställd på <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> skickas taggen till kontextobjektet, som i det här exemplet. Det är den enda skillnaden mellan det här fallet och det tidigare exemplet med <code class=\"docutils literal notranslate\"><span class=\"pre\">inclusion_tag</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">inclusion_tag</span></code>-funktioner kan acceptera valfritt antal positionella argument eller nyckelord. Till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">inclusion_tag</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_template.html&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_tag</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"n\">warning</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;warning&quot;</span><span class=\"p\">]</span>\n    <span class=\"n\">profile</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;profile&quot;</span><span class=\"p\">]</span>\n    <span class=\"o\">...</span>\n    <span class=\"k\">return</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>I mallen kan sedan valfritt antal argument, åtskilda med mellanslag, skickas till malltaggen. Precis som i Python anges värdena för nyckelordsargument med hjälp av likhetstecknet (”<code class=\"docutils literal notranslate\"><span class=\"pre\">=</span></code>”) och måste anges efter de positionella argumenten. Till exempel:</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\">my_tag</span> <span class=\"m\">123</span> <span class=\"s2\">&quot;abcd&quot;</span> <span class=\"nv\">book.title</span> <span class=\"nv\">warning</span><span class=\"o\">=</span><span class=\"nv\">message</span><span class=\"o\">|</span><span class=\"nf\">lower</span> <span class=\"nv\">profile</span><span class=\"o\">=</span><span class=\"nv\">user.profile</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</section>\n<section id=\"advanced-custom-template-tags\">\n<h3>Avancerade anpassade malltaggar<a class=\"heading-anchor\" href=\"#advanced-custom-template-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ibland räcker det inte med de grundläggande funktionerna för att skapa egna malltaggar. Oroa dig inte, Django ger dig fullständig tillgång till de interna funktioner som krävs för att bygga en malltagg från grunden.</p>\n</section>\n<section id=\"a-quick-overview\">\n<h3>En snabb översikt<a class=\"heading-anchor\" href=\"#a-quick-overview\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Mallsystemet fungerar i en tvåstegsprocess: kompilering och rendering. När du definierar en anpassad malltagg anger du hur kompileringen och renderingen ska gå till.</p>\n<p>När Django kompilerar en mall delar den upp den råa malltexten i ”noder”. Varje nod är en instans av <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.Node</span></code> och har en <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> metod. En kompilerad mall är en lista med <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code>-objekt. När du anropar <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> på ett kompilerat mallobjekt, anropar mallen <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> på varje <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> i dess nodlista, med det givna sammanhanget.  Alla resultat sammankopplas för att bilda mallens utdata.</p>\n<p>För att definiera en anpassad malltagg anger du alltså hur den råa malltaggen konverteras till en <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> (kompileringsfunktionen) och vad nodens <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code>-metod gör.</p>\n</section>\n<section id=\"writing-the-compilation-function\">\n<h3>Skriva sammanställningsfunktionen<a class=\"heading-anchor\" href=\"#writing-the-compilation-function\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>För varje malltagg som mallparsern stöter på anropar den en Python-funktion med taggens innehåll och själva parserobjektet. Denna funktion är ansvarig för att returnera en <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code>-instans baserat på innehållet i taggen.</p>\n<p>Låt oss till exempel skriva en fullständig implementering av vår malltagg, <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">current_time</span> <span class=\"pre\">%}</span></code>, som visar aktuellt datum/tid, formaterat enligt en parameter som anges i taggen, i <a class=\"reference external\" href=\"https://docs.python.org/3/library/time.html#time.strftime\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">strftime()</span></code></a>-syntax. Det är en bra idé att bestämma taggens syntax före allt annat. I vårt fall kan vi säga att taggen ska användas 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=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>The time is <span class=\"cp\">{%</span> <span class=\"k\">current_time</span> <span class=\"s2\">&quot;%Y-%m-%d %I:%M %p&quot;</span> <span class=\"cp\">%}</span>.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Parsern för denna funktion ska ta parametern och skapa ett <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code>-objekt:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">template</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">do_current_time</span><span class=\"p\">(</span><span class=\"n\">parser</span><span class=\"p\">,</span> <span class=\"n\">token</span><span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"c1\"># split_contents() knows not to split quoted strings.</span>\n        <span class=\"n\">tag_name</span><span class=\"p\">,</span> <span class=\"n\">format_string</span> <span class=\"o\">=</span> <span class=\"n\">token</span><span class=\"o\">.</span><span class=\"n\">split_contents</span><span class=\"p\">()</span>\n    <span class=\"k\">except</span> <span class=\"ne\">ValueError</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">TemplateSyntaxError</span><span class=\"p\">(</span>\n            <span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag requires a single argument&quot;</span> <span class=\"o\">%</span> <span class=\"n\">token</span><span class=\"o\">.</span><span class=\"n\">contents</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n        <span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"p\">(</span><span class=\"n\">format_string</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"n\">format_string</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"ow\">and</span> <span class=\"n\">format_string</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"ow\">in</span> <span class=\"p\">(</span><span class=\"s1\">&#39;&quot;&#39;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&#39;&quot;</span><span class=\"p\">)):</span>\n        <span class=\"k\">raise</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">TemplateSyntaxError</span><span class=\"p\">(</span>\n            <span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag&#39;s argument should be in quotes&quot;</span> <span class=\"o\">%</span> <span class=\"n\">tag_name</span>\n        <span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">CurrentTimeNode</span><span class=\"p\">(</span><span class=\"n\">format_string</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>Anteckningar:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">parser</span></code> är mallens parserobjekt. Vi behöver det inte i det här exemplet.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">token.contents</span></code> är en sträng med taggens råa innehåll. I vårt exempel är det <code class=\"docutils literal notranslate\"><span class=\"pre\">'current_time</span> <span class=\"pre\">&quot;%Y-%m-%d</span> <span class=\"pre\">%I:%M</span> <span class=\"pre\">%p&quot;'</span></code>.</p></li>\n<li><p>Metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">token.split_contents()</span></code> separerar argumenten på mellanslag medan citerade strängar hålls ihop. Den mer okomplicerade <code class=\"docutils literal notranslate\"><span class=\"pre\">token.contents.split()</span></code> skulle inte vara lika robust, eftersom den naivt skulle dela på <em>alla</em> mellanslag, inklusive de inom citerade strängar. Det är en bra idé att alltid använda <code class=\"docutils literal notranslate\"><span class=\"pre\">token.split_contents()</span></code>.</p></li>\n<li><p>Denna funktion är ansvarig för att skapa <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.TemplateSyntaxError</span></code>, med användbara meddelanden, för alla syntaxfel.</p></li>\n<li><p>Undantagen <code class=\"docutils literal notranslate\"><span class=\"pre\">TemplateSyntaxError</span></code> använder variabeln <code class=\"docutils literal notranslate\"><span class=\"pre\">tag_name</span></code>. Hårdkoda inte taggens namn i dina felmeddelanden, eftersom det kopplar taggens namn till din funktion. <code class=\"docutils literal notranslate\"><span class=\"pre\">token.contents.split()[0]</span></code> kommer ’’alltid’’ att vara namnet på din tagg - även när taggen inte har några argument.</p></li>\n<li><p>Funktionen returnerar en <code class=\"docutils literal notranslate\"><span class=\"pre\">CurrentTimeNode</span></code> med allt noden behöver veta om den här taggen. I det här fallet skickar den argumentet – <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;%Y-%m-%d</span> <span class=\"pre\">%I:%M</span> <span class=\"pre\">%p&quot;</span></code>. De inledande och avslutande citaten från malltaggen tas bort i <code class=\"docutils literal notranslate\"><span class=\"pre\">format_string[1:-1]</span></code>.</p></li>\n<li><p>Parsningen är på mycket låg nivå. Django-utvecklarna har experimenterat med att skriva små ramverk ovanpå detta parsningssystem, med hjälp av tekniker som EBNF-grammatiker, men dessa experiment gjorde mallmotorn för långsam. Den är på låg nivå för att det är snabbast.</p></li>\n</ul>\n</section>\n<section id=\"writing-the-renderer\">\n<h3>Skriva renderingsprogrammet<a class=\"heading-anchor\" href=\"#writing-the-renderer\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Det andra steget i att skriva egna taggar är att definiera en subklass av <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> som har en <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code>-metod.</p>\n<p>Om vi fortsätter med exemplet ovan måste vi definiera <code class=\"docutils literal notranslate\"><span class=\"pre\">CurrentTimeNode</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">template</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CurrentTimeNode</span><span class=\"p\">(</span><span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Node</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">format_string</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">format_string</span> <span class=\"o\">=</span> <span class=\"n\">format_string</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">format_string</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Anteckningar:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> hämtar <code class=\"docutils literal notranslate\"><span class=\"pre\">format_string</span></code> från <code class=\"docutils literal notranslate\"><span class=\"pre\">do_current_time()</span></code>. Skicka alltid eventuella alternativ/parametrar/argument till en <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> via dess <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code>.</p></li>\n<li><p>Det är i metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> som det egentliga arbetet sker.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> bör i allmänhet misslyckas tyst, särskilt i en produktionsmiljö. I vissa fall dock, särskilt om <code class=\"docutils literal notranslate\"><span class=\"pre\">context.template.engine.debug</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, kan denna metod ge upphov till ett undantag för att göra felsökningen enklare. Till exempel ger flera kärntaggar upphov till <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.TemplateSyntaxError</span></code> om de får fel antal eller typ av argument.</p></li>\n</ul>\n<p>I slutändan resulterar denna frikoppling av kompilering och återgivning i ett effektivt mallsystem, eftersom en mall kan återge flera kontexter utan att behöva analyseras flera gånger.</p>\n</section>\n<section id=\"auto-escaping-considerations\">\n<span id=\"tags-auto-escaping\"></span><h3>Överväganden om automatisk eskapning<a class=\"heading-anchor\" href=\"#auto-escaping-considerations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Utdata från malltaggar körs <strong>inte</strong> automatiskt genom filtren för automatisk eskapning (med undantag för <a class=\"reference internal\" href=\"#django.template.Library.simple_tag\" title=\"django.template.Library.simple_tag\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">simple_tag()</span></code></a> som beskrivs ovan). Det finns dock fortfarande ett par saker som du bör tänka på när du skriver en malltagg.</p>\n<p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code>-metoden i din malltagg lagrar resultatet i en kontextvariabel (i stället för att returnera resultatet i en sträng), bör den se till att anropa <code class=\"docutils literal notranslate\"><span class=\"pre\">mark_safe()</span></code> om så är lämpligt. När variabeln slutligen renderas kommer den att påverkas av den auto-escape-inställning som gäller vid den tidpunkten, så innehåll som bör vara säkert från ytterligare escaping måste markeras som sådant.</p>\n<p>Om din malltagg skapar en ny kontext för att utföra en underrendering, ska du också ställa in auto-escape-attributet till den aktuella kontextens värde. Metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> för klassen <code class=\"docutils literal notranslate\"><span class=\"pre\">Context</span></code> tar en parameter som heter <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape</span></code> som du kan använda för detta ändamål. Till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Context</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">new_context</span> <span class=\"o\">=</span> <span class=\"n\">Context</span><span class=\"p\">({</span><span class=\"s2\">&quot;var&quot;</span><span class=\"p\">:</span> <span class=\"n\">obj</span><span class=\"p\">},</span> <span class=\"n\">autoescape</span><span class=\"o\">=</span><span class=\"n\">context</span><span class=\"o\">.</span><span class=\"n\">autoescape</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ... Do something with new_context ...</span>\n</code></pre></div>\n<p>Detta är inte en särskilt vanlig situation, men det är användbart om du renderar en mall själv. Till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n    <span class=\"n\">t</span> <span class=\"o\">=</span> <span class=\"n\">context</span><span class=\"o\">.</span><span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">engine</span><span class=\"o\">.</span><span class=\"n\">get_template</span><span class=\"p\">(</span><span class=\"s2\">&quot;small_fragment.html&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">Context</span><span class=\"p\">({</span><span class=\"s2\">&quot;var&quot;</span><span class=\"p\">:</span> <span class=\"n\">obj</span><span class=\"p\">},</span> <span class=\"n\">autoescape</span><span class=\"o\">=</span><span class=\"n\">context</span><span class=\"o\">.</span><span class=\"n\">autoescape</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Om vi hade försummat att skicka in det aktuella värdet för <code class=\"docutils literal notranslate\"><span class=\"pre\">context.autoescape</span></code> till vår nya <code class=\"docutils literal notranslate\"><span class=\"pre\">Context</span></code> i det här exemplet skulle resultaten <em>alltid</em> ha escapats automatiskt, vilket kanske inte är det önskade beteendet om malltaggen används i ett <a class=\"reference internal\" href=\"/sv/5.2/ref/templates/builtins/#std-templatetag-autoescape\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">autoescape</span> <span class=\"pre\">off</span> <span class=\"pre\">%}</span></code></a>-block.</p>\n</section>\n<section id=\"thread-safety-considerations\">\n<span id=\"template-tag-thread-safety\"></span><h3>Säkerhetsöverväganden för trådar<a class=\"heading-anchor\" href=\"#thread-safety-considerations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>När en nod har parsats kan dess <code class=\"docutils literal notranslate\"><span class=\"pre\">render</span></code>-metod anropas ett obegränsat antal gånger. Eftersom Django ibland körs i flertrådade miljöer kan en enda nod samtidigt renderas med olika kontexter som svar på två separata förfrågningar. Därför är det viktigt att se till att dina malltaggar är trådsäkra.</p>\n<p>För att se till att dina malltaggar är trådsäkra bör du aldrig lagra tillståndsinformation på själva noden. Django tillhandahåller till exempel en inbyggd <a class=\"reference internal\" href=\"/sv/5.2/ref/templates/builtins/#std-templatetag-cycle\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">cycle</span></code></a> malltagg som cyklar mellan en lista med givna strängar varje gång den återges:</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\">for</span> <span class=\"nv\">o</span> <span class=\"k\">in</span> <span class=\"nv\">some_list</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">tr</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">cycle</span> <span class=\"s1\">&#39;row1&#39;</span> <span class=\"s1\">&#39;row2&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n        ...\n    <span class=\"p\">&lt;/</span><span class=\"nt\">tr</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>En naiv implementation av <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode</span></code> kan se ut ungefä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=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">itertools</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">template</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CycleNode</span><span class=\"p\">(</span><span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Node</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">cyclevars</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">cycle_iter</span> <span class=\"o\">=</span> <span class=\"n\">itertools</span><span class=\"o\">.</span><span class=\"n\">cycle</span><span class=\"p\">(</span><span class=\"n\">cyclevars</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">next</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">cycle_iter</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Men anta att vi har två mallar som renderar mallutdraget från ovan samtidigt:</p>\n<ol class=\"arabic simple\">\n<li><p>Tråd 1 utför sin första loopiteration, <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode.render()</span></code> returnerar ’row1’</p></li>\n<li><p>Tråd 2 utför sin första loopiteration, <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode.render()</span></code> returnerar ’row2’</p></li>\n<li><p>Tråd 1 utför sin andra loopiteration, <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode.render()</span></code> returnerar ’row1’</p></li>\n<li><p>Tråd 2 utför sin andra loopiteration, <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode.render()</span></code> returnerar ’row2’</p></li>\n</ol>\n<p>CycleNode itererar, men den itererar globalt. När det gäller tråd 1 och tråd 2 returnerar den alltid samma värde. Detta är inte vad vi vill!</p>\n<p>För att lösa detta problem tillhandahåller Django en <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context</span></code> som är associerad med <code class=\"docutils literal notranslate\"><span class=\"pre\">contexten</span></code> för den mall som för närvarande renderas. <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context</span></code> beter sig som en Python-dictionary och bör användas för att lagra <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code>-tillstånd mellan anrop av <code class=\"docutils literal notranslate\"><span class=\"pre\">render</span></code>-metoden.</p>\n<p>Låt oss omarbeta vår <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode</span></code>-implementering för att använda <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CycleNode</span><span class=\"p\">(</span><span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Node</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">cyclevars</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">cyclevars</span> <span class=\"o\">=</span> <span class=\"n\">cyclevars</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">context</span><span class=\"o\">.</span><span class=\"n\">render_context</span><span class=\"p\">:</span>\n            <span class=\"n\">context</span><span class=\"o\">.</span><span class=\"n\">render_context</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">itertools</span><span class=\"o\">.</span><span class=\"n\">cycle</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">cyclevars</span><span class=\"p\">)</span>\n        <span class=\"n\">cycle_iter</span> <span class=\"o\">=</span> <span class=\"n\">context</span><span class=\"o\">.</span><span class=\"n\">render_context</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> <span class=\"nb\">next</span><span class=\"p\">(</span><span class=\"n\">cycle_iter</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Observera att det är helt säkert att lagra global information som inte kommer att ändras under hela <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> liv som ett attribut. I fallet med <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">cyclevars</span></code> argumentet ändras inte efter <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> är instantiated, så vi behöver inte sätta det i <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context</span></code>. Men tillståndsinformation som är specifik för den mall som för närvarande återges, som den aktuella iterationen av <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode</span></code>, bör lagras i <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context</span></code>.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Observera hur vi använde <code class=\"docutils literal notranslate\"><span class=\"pre\">self</span></code> för att omfatta den <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode</span></code> specifika informationen inom <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context</span></code>. Det kan finnas flera <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNodes</span></code> i en given mall, så vi måste vara försiktiga så att vi inte stjäl en annan nods tillståndsinformation. Det enklaste sättet att göra detta är att alltid använda <code class=\"docutils literal notranslate\"><span class=\"pre\">self</span></code> som nyckel till <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context</span></code>. Om du håller reda på flera tillståndsvariabler kan du göra <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context[self]</span></code> till en ordbok.</p>\n</aside>\n</section>\n<section id=\"registering-the-tag\">\n<h3>Registrering av taggen<a class=\"heading-anchor\" href=\"#registering-the-tag\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Slutligen, registrera taggen med din moduls <code class=\"docutils literal notranslate\"><span class=\"pre\">Library</span></code> instans, som förklaras i <a class=\"reference internal\" href=\"#howto-writing-custom-template-tags\"><span class=\"std std-ref\">skriva egna malltaggar</span></a> ovan. 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=\"n\">register</span><span class=\"o\">.</span><span class=\"n\">tag</span><span class=\"p\">(</span><span class=\"s2\">&quot;current_time&quot;</span><span class=\"p\">,</span> <span class=\"n\">do_current_time</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">tag()</span></code> tar två argument:</p>\n<ol class=\"arabic simple\">\n<li><p>Namnet på malltaggen - en sträng. Om detta utelämnas kommer namnet på kompileringsfunktionen att användas.</p></li>\n<li><p>Kompileringsfunktionen – en Python-funktion (inte namnet på funktionen som en sträng).</p></li>\n</ol>\n<p>Precis som med filterregistrering är det också möjligt att använda detta som en dekorator:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">tag</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;current_time&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">do_current_time</span><span class=\"p\">(</span><span class=\"n\">parser</span><span class=\"p\">,</span> <span class=\"n\">token</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n\n\n<span class=\"nd\">@register</span><span class=\"o\">.</span><span class=\"n\">tag</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">shout</span><span class=\"p\">(</span><span class=\"n\">parser</span><span class=\"p\">,</span> <span class=\"n\">token</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Om du utelämnar argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>, som i det andra exemplet ovan, kommer Django att använda funktionens namn som taggnamn.</p>\n</section>\n<section id=\"passing-template-variables-to-the-tag\">\n<h3>Överföring av mallvariabler till taggen<a class=\"heading-anchor\" href=\"#passing-template-variables-to-the-tag\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Även om du kan skicka valfritt antal argument till en malltagg med hjälp av <code class=\"docutils literal notranslate\"><span class=\"pre\">token.split_contents()</span></code>, packas alla argument upp som stränglitteraler. Det krävs lite mer arbete för att skicka dynamiskt innehåll (en mallvariabel) till en malltagg som ett argument.</p>\n<p>Medan de tidigare exemplen har formaterat den aktuella tiden till en sträng och returnerat strängen, anta att du vill skicka in en <a class=\"reference internal\" href=\"/sv/5.2/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a> från ett objekt och låta malltaggen formatera datumtiden:</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=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>This post was last updated at <span class=\"cp\">{%</span> <span class=\"k\">format_time</span> <span class=\"nv\">blog_entry.date_updated</span> <span class=\"s2\">&quot;%Y-%m-%d %I:%M %p&quot;</span> <span class=\"cp\">%}</span>.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Initialt kommer <code class=\"docutils literal notranslate\"><span class=\"pre\">token.split_contents()</span></code> att returnera tre värden:</p>\n<ol class=\"arabic simple\">\n<li><p>Taggens namn <code class=\"docutils literal notranslate\"><span class=\"pre\">format_time</span></code>.</p></li>\n<li><p>Strängen <code class=\"docutils literal notranslate\"><span class=\"pre\">'blog_entry.date_updated'</span></code> (utan omgivande citattecken).</p></li>\n<li><p>Formateringssträngen <code class=\"docutils literal notranslate\"><span class=\"pre\">'&quot;%Y-%m-%d</span> <span class=\"pre\">%I:%M</span> <span class=\"pre\">%p&quot;'</span></code>. Returvärdet från <code class=\"docutils literal notranslate\"><span class=\"pre\">split_contents()</span></code> kommer att inkludera inledande och avslutande citattecken för stränglitteraler som denna.</p></li>\n</ol>\n<p>Nu bör din tagg börja se ut så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">template</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">do_format_time</span><span class=\"p\">(</span><span class=\"n\">parser</span><span class=\"p\">,</span> <span class=\"n\">token</span><span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"c1\"># split_contents() knows not to split quoted strings.</span>\n        <span class=\"n\">tag_name</span><span class=\"p\">,</span> <span class=\"n\">date_to_be_formatted</span><span class=\"p\">,</span> <span class=\"n\">format_string</span> <span class=\"o\">=</span> <span class=\"n\">token</span><span class=\"o\">.</span><span class=\"n\">split_contents</span><span class=\"p\">()</span>\n    <span class=\"k\">except</span> <span class=\"ne\">ValueError</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">TemplateSyntaxError</span><span class=\"p\">(</span>\n            <span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag requires exactly two arguments&quot;</span> <span class=\"o\">%</span> <span class=\"n\">token</span><span class=\"o\">.</span><span class=\"n\">contents</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n        <span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"p\">(</span><span class=\"n\">format_string</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"n\">format_string</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"ow\">and</span> <span class=\"n\">format_string</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"ow\">in</span> <span class=\"p\">(</span><span class=\"s1\">&#39;&quot;&#39;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&#39;&quot;</span><span class=\"p\">)):</span>\n        <span class=\"k\">raise</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">TemplateSyntaxError</span><span class=\"p\">(</span>\n            <span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag&#39;s argument should be in quotes&quot;</span> <span class=\"o\">%</span> <span class=\"n\">tag_name</span>\n        <span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">FormatTimeNode</span><span class=\"p\">(</span><span class=\"n\">date_to_be_formatted</span><span class=\"p\">,</span> <span class=\"n\">format_string</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>Du måste också ändra renderaren så att den hämtar det faktiska innehållet i egenskapen <code class=\"docutils literal notranslate\"><span class=\"pre\">date_updated</span></code> i objektet <code class=\"docutils literal notranslate\"><span class=\"pre\">blog_entry</span></code>.  Detta kan åstadkommas genom att använda klassen <code class=\"docutils literal notranslate\"><span class=\"pre\">Variable()</span></code> i <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template</span></code>.</p>\n<p>För att använda klassen <code class=\"docutils literal notranslate\"><span class=\"pre\">Variable</span></code>, instansiera den med namnet på den variabel som ska lösas och anropa sedan <code class=\"docutils literal notranslate\"><span class=\"pre\">variable.resolve(context)</span></code>. Så här gör du till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">FormatTimeNode</span><span class=\"p\">(</span><span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Node</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">date_to_be_formatted</span><span class=\"p\">,</span> <span class=\"n\">format_string</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">date_to_be_formatted</span> <span class=\"o\">=</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span><span class=\"n\">date_to_be_formatted</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">format_string</span> <span class=\"o\">=</span> <span class=\"n\">format_string</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            <span class=\"n\">actual_date</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">date_to_be_formatted</span><span class=\"o\">.</span><span class=\"n\">resolve</span><span class=\"p\">(</span><span class=\"n\">context</span><span class=\"p\">)</span>\n            <span class=\"k\">return</span> <span class=\"n\">actual_date</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">format_string</span><span class=\"p\">)</span>\n        <span class=\"k\">except</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">VariableDoesNotExist</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s2\">&quot;&quot;</span>\n</code></pre></div>\n<p>Variabelupplösning ger upphov till undantaget <code class=\"docutils literal notranslate\"><span class=\"pre\">VariableDoesNotExist</span></code> om den inte kan lösa upp den sträng som skickas till den i sidans aktuella kontext.</p>\n</section>\n<section id=\"setting-a-variable-in-the-context\">\n<h3>Ställa in en variabel i kontexten<a class=\"heading-anchor\" href=\"#setting-a-variable-in-the-context\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Exemplen ovan matar ut ett värde. I allmänhet är det mer flexibelt om dina malltaggar ställer in mallvariabler istället för att mata ut värden. På så sätt kan mallförfattare återanvända de värden som dina malltaggar skapar.</p>\n<p>Om du vill ställa in en variabel i kontexten använder du dictionary assignment på kontextobjektet i metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code>. Här är en uppdaterad version av <code class=\"docutils literal notranslate\"><span class=\"pre\">CurrentTimeNode</span></code> som ställer in en mallvariabel <code class=\"docutils literal notranslate\"><span class=\"pre\">current_time</span></code> istället för att skriva ut den:</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\">datetime</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">template</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CurrentTimeNode2</span><span class=\"p\">(</span><span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Node</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">format_string</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">format_string</span> <span class=\"o\">=</span> <span class=\"n\">format_string</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n        <span class=\"n\">context</span><span class=\"p\">[</span><span class=\"s2\">&quot;current_time&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">format_string</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;&quot;</span>\n</code></pre></div>\n<p>Observera att <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> returnerar en tom sträng. <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> bör alltid returnera strängar. Om allt malltaggen gör är att ställa in en variabel, ska <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> returnera den tomma strängen.</p>\n<p>Så här använder du den här nya versionen av taggen:</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\">current_time</span> <span class=\"s2\">&quot;%Y-%m-%d %I:%M %p&quot;</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>The time is <span class=\"cp\">{{</span> <span class=\"nv\">current_time</span> <span class=\"cp\">}}</span>.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<aside class=\"admonition-variable-scope-in-context admonition\">\n<p class=\"admonition-title\">Variabelns omfattning i sitt sammanhang</p>\n<p>Alla variabler som anges i kontexten kommer endast att vara tillgängliga i samma <code class=\"docutils literal notranslate\"><span class=\"pre\">block</span></code> i mallen där de tilldelades. Det här beteendet är avsiktligt; det ger ett utrymme för variabler så att de inte står i konflikt med kontexten i andra block.</p>\n</aside>\n<p>Men det finns ett problem med <code class=\"docutils literal notranslate\"><span class=\"pre\">CurrentTimeNode2</span></code>: Variabelnamnet <code class=\"docutils literal notranslate\"><span class=\"pre\">current_time</span></code> är hårdkodat. Detta innebär att du måste se till att din mall inte använder <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">current_time</span> <span class=\"pre\">}}</span></code> någon annanstans, eftersom <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">current_time</span> <span class=\"pre\">%}</span></code> blint kommer att skriva över variabelns värde. En renare lösning är att låta malltaggen ange namnet på utdatavariabeln, 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\">current_time</span> <span class=\"s2\">&quot;%Y-%m-%d %I:%M %p&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">my_current_time</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>The current time is <span class=\"cp\">{{</span> <span class=\"nv\">my_current_time</span> <span class=\"cp\">}}</span>.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>För att göra det måste du refaktorisera både kompileringsfunktionen och <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code>-klassen, 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\">import</span><span class=\"w\"> </span><span class=\"nn\">re</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CurrentTimeNode3</span><span class=\"p\">(</span><span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Node</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">format_string</span><span class=\"p\">,</span> <span class=\"n\">var_name</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">format_string</span> <span class=\"o\">=</span> <span class=\"n\">format_string</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">var_name</span> <span class=\"o\">=</span> <span class=\"n\">var_name</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n        <span class=\"n\">context</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">var_name</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">strftime</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">format_string</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;&quot;</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">do_current_time</span><span class=\"p\">(</span><span class=\"n\">parser</span><span class=\"p\">,</span> <span class=\"n\">token</span><span class=\"p\">):</span>\n    <span class=\"c1\"># This version uses a regular expression to parse tag contents.</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Splitting by None == splitting by spaces.</span>\n        <span class=\"n\">tag_name</span><span class=\"p\">,</span> <span class=\"n\">arg</span> <span class=\"o\">=</span> <span class=\"n\">token</span><span class=\"o\">.</span><span class=\"n\">contents</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"k\">except</span> <span class=\"ne\">ValueError</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">TemplateSyntaxError</span><span class=\"p\">(</span>\n            <span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag requires arguments&quot;</span> <span class=\"o\">%</span> <span class=\"n\">token</span><span class=\"o\">.</span><span class=\"n\">contents</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n        <span class=\"p\">)</span>\n    <span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">search</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s2\">&quot;(.*?) as (\\w+)&quot;</span><span class=\"p\">,</span> <span class=\"n\">arg</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">m</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">TemplateSyntaxError</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag had invalid arguments&quot;</span> <span class=\"o\">%</span> <span class=\"n\">tag_name</span><span class=\"p\">)</span>\n    <span class=\"n\">format_string</span><span class=\"p\">,</span> <span class=\"n\">var_name</span> <span class=\"o\">=</span> <span class=\"n\">m</span><span class=\"o\">.</span><span class=\"n\">groups</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"p\">(</span><span class=\"n\">format_string</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"n\">format_string</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"ow\">and</span> <span class=\"n\">format_string</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"ow\">in</span> <span class=\"p\">(</span><span class=\"s1\">&#39;&quot;&#39;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;&#39;&quot;</span><span class=\"p\">)):</span>\n        <span class=\"k\">raise</span> <span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">TemplateSyntaxError</span><span class=\"p\">(</span>\n            <span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> tag&#39;s argument should be in quotes&quot;</span> <span class=\"o\">%</span> <span class=\"n\">tag_name</span>\n        <span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">CurrentTimeNode3</span><span class=\"p\">(</span><span class=\"n\">format_string</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">],</span> <span class=\"n\">var_name</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Skillnaden här är att <code class=\"docutils literal notranslate\"><span class=\"pre\">do_current_time()</span></code> hämtar formatsträngen och variabelnamnet och skickar båda till <code class=\"docutils literal notranslate\"><span class=\"pre\">CurrentTimeNode3</span></code>.</p>\n<p>Slutligen, om du bara behöver ha en enkel syntax för din anpassade kontextuppdaterande malltagg, kan du överväga att använda <a class=\"reference internal\" href=\"#django.template.Library.simple_tag\" title=\"django.template.Library.simple_tag\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">simple_tag()</span></code></a>-genvägen, som stöder tilldelning av taggresultaten till en mallvariabel.</p>\n</section>\n<section id=\"parsing-until-another-block-tag\">\n<h3>Parsning tills en annan blocktagg<a class=\"heading-anchor\" href=\"#parsing-until-another-block-tag\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Malltaggar kan fungera tillsammans. Till exempel döljer standardtaggen <a class=\"reference internal\" href=\"/sv/5.2/ref/templates/builtins/#std-templatetag-comment\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">comment</span> <span class=\"pre\">%}</span></code></a> allt fram till <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code>. För att skapa en malltagg som den här använder du <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.parse()</span></code> i din kompileringsfunktion.</p>\n<p>Så här kan en förenklad <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">comment</span> <span class=\"pre\">%}</span></code> tagg implementeras:</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\">do_comment</span><span class=\"p\">(</span><span class=\"n\">parser</span><span class=\"p\">,</span> <span class=\"n\">token</span><span class=\"p\">):</span>\n    <span class=\"n\">nodelist</span> <span class=\"o\">=</span> <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">parse</span><span class=\"p\">((</span><span class=\"s2\">&quot;endcomment&quot;</span><span class=\"p\">,))</span>\n    <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">delete_first_token</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">CommentNode</span><span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CommentNode</span><span class=\"p\">(</span><span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Node</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;&quot;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Den faktiska implementeringen av <a class=\"reference internal\" href=\"/sv/5.2/ref/templates/builtins/#std-templatetag-comment\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">comment</span> <span class=\"pre\">%}</span></code></a> är något annorlunda i det att den tillåter brutna malltaggar att visas mellan <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">comment</span> <span class=\"pre\">%}</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code>. Detta görs genom att anropa <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.skip_past('endcomment')</span></code> istället för <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.parse(('endcomment',)))</span></code> följt av <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.delete_first_token()</span></code>, vilket gör att en nodlista inte genereras.</p>\n</aside>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">parser.parse()</span></code> tar en tupel av namn på blocktaggar ’’att analysera fram till’’. Den returnerar en instans av <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.NodeList</span></code>, som är en lista över alla <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code>-objekt som parsern stötte på ’’innan’’ den stötte på någon av de taggar som anges i tupeln.</p>\n<p>I <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;nodelist</span> <span class=\"pre\">=</span> <span class=\"pre\">parser.parse(('endcomment',))&quot;</span></code> i exemplet ovan är <code class=\"docutils literal notranslate\"><span class=\"pre\">nodelist</span></code> en lista över alla noder mellan <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">comment</span> <span class=\"pre\">%}</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code>, exklusive <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">comment</span> <span class=\"pre\">%}</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code> själva.</p>\n<p>När <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.parse()</span></code> har anropats har parsern ännu inte ”konsumerat” taggen <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code>, så koden måste uttryckligen anropa <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.delete_first_token()</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">CommentNode.render()</span></code> returnerar en tom sträng. Allt mellan <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">comment</span> <span class=\"pre\">%}</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code> ignoreras.</p>\n</section>\n<section id=\"parsing-until-another-block-tag-and-saving-contents\">\n<h3>Parsning till en annan blocktagg och lagring av innehåll<a class=\"heading-anchor\" href=\"#parsing-until-another-block-tag-and-saving-contents\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>I det föregående exemplet kastade <code class=\"docutils literal notranslate\"><span class=\"pre\">do_comment()</span></code> bort allt mellan <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">comment</span> <span class=\"pre\">%}</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code>. Istället för att göra det är det möjligt att göra något med koden mellan blocktaggar.</p>\n<p>Här är till exempel en anpassad malltagg, <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">upper</span> <span class=\"pre\">%}</span></code>, som skriver allt mellan sig själv och <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endupper</span> <span class=\"pre\">%}</span></code> med stor bokstav.</p>\n<p>Användning:</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\">upper</span> <span class=\"cp\">%}</span>This will appear in uppercase, <span class=\"cp\">{{</span> <span class=\"nv\">your_name</span> <span class=\"cp\">}}</span>.<span class=\"cp\">{%</span> <span class=\"k\">endupper</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Precis som i det föregående exemplet använder vi <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.parse()</span></code>. Men den här gången skickar vi den resulterande <code class=\"docutils literal notranslate\"><span class=\"pre\">nodelist</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">do_upper</span><span class=\"p\">(</span><span class=\"n\">parser</span><span class=\"p\">,</span> <span class=\"n\">token</span><span class=\"p\">):</span>\n    <span class=\"n\">nodelist</span> <span class=\"o\">=</span> <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">parse</span><span class=\"p\">((</span><span class=\"s2\">&quot;endupper&quot;</span><span class=\"p\">,))</span>\n    <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">delete_first_token</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">UpperNode</span><span class=\"p\">(</span><span class=\"n\">nodelist</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">UpperNode</span><span class=\"p\">(</span><span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">Node</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">nodelist</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nodelist</span> <span class=\"o\">=</span> <span class=\"n\">nodelist</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n        <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nodelist</span><span class=\"o\">.</span><span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">context</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"n\">output</span><span class=\"o\">.</span><span class=\"n\">upper</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Det enda nya konceptet här är <code class=\"docutils literal notranslate\"><span class=\"pre\">self.nodelist.render(context)</span></code> i <code class=\"docutils literal notranslate\"><span class=\"pre\">UpperNode.render()</span></code>.</p>\n<p>För fler exempel på komplex rendering, se källkoden för <a class=\"reference internal\" href=\"/sv/5.2/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">for</span> <span class=\"pre\">%}</span></code></a> i <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/5.2.x/django/template/defaulttags.py\">django/template/defaulttags.py</a> och <a class=\"reference internal\" href=\"/sv/5.2/ref/templates/builtins/#std-templatetag-if\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">if</span> <span class=\"pre\">%}</span></code></a> i <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/5.2.x/django/template/smartif.py\">django/template/smartif.py</a>.</p>\n</section>\n</section>","rootId":"how-to-create-custom-template-tags-and-filters","toc":[{"title":"Layout för kod","anchor":"code-layout","children":[]},{"title":"Skriva anpassade mallfilter","anchor":"writing-custom-template-filters","children":[{"title":"Registrering av anpassade filter","anchor":"registering-custom-filters","children":[]},{"title":"Mallfilter som förväntar sig strängar","anchor":"template-filters-that-expect-strings","children":[]},{"title":"Filter och automatisk särskrivning","anchor":"filters-and-auto-escaping","children":[]},{"title":"Filter och tidszoner","anchor":"filters-and-time-zones","children":[]}]},{"title":"Skriva anpassade malltaggar","anchor":"writing-custom-template-tags","children":[{"title":"Enkla taggar","anchor":"simple-tags","children":[]},{"title":"Enkla block-taggar","anchor":"simple-block-tags","children":[{"title":"Ett komplett exempel","anchor":"a-complete-example","children":[]}]},{"title":"Taggar för inkludering","anchor":"inclusion-tags","children":[]},{"title":"Avancerade anpassade malltaggar","anchor":"advanced-custom-template-tags","children":[]},{"title":"En snabb översikt","anchor":"a-quick-overview","children":[]},{"title":"Skriva sammanställningsfunktionen","anchor":"writing-the-compilation-function","children":[]},{"title":"Skriva renderingsprogrammet","anchor":"writing-the-renderer","children":[]},{"title":"Överväganden om automatisk eskapning","anchor":"auto-escaping-considerations","children":[]},{"title":"Säkerhetsöverväganden för trådar","anchor":"thread-safety-considerations","children":[]},{"title":"Registrering av taggen","anchor":"registering-the-tag","children":[]},{"title":"Överföring av mallvariabler till taggen","anchor":"passing-template-variables-to-the-tag","children":[]},{"title":"Ställa in en variabel i kontexten","anchor":"setting-a-variable-in-the-context","children":[]},{"title":"Parsning tills en annan blocktagg","anchor":"parsing-until-another-block-tag","children":[]},{"title":"Parsning till en annan blocktagg och lagring av innehåll","anchor":"parsing-until-another-block-tag-and-saving-contents","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"Hur man gör-guider","url":"/sv/5.2/howto/"}],"prev":{"docname":"howto/custom-template-backend","title":"Hur man implementerar en anpassad mallbackend","url":"/sv/5.2/howto/custom-template-backend/"},"next":{"docname":"howto/static-files/index","title":"Hur man hanterar statiska filer (t.ex. bilder, JavaScript, CSS)","url":"/sv/5.2/howto/static-files/"},"formats":{"html":"/sv/5.2/howto/custom-template-tags/","markdown":"/sv/5.2/howto/custom-template-tags.md","json":"/sv/5.2/howto/custom-template-tags.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/howto/custom-template-tags.txt","official":"https://docs.djangoproject.com/sv/5.2/howto/custom-template-tags/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}