{"title":"Como criar tags e filtros de template customizados","version":"6.0","locale":"pt-br","docname":"howto/custom-template-tags","url":"/pt-br/6.0/howto/custom-template-tags/","canonical":"https://djangodocs.dev/pt-br/6.0/howto/custom-template-tags/","summary":"A linguagem de templates do Django vem com uma variedade de built-in tags e filtros projetados para atender as necessidades da lógica de apresentação da sua…","html":"<h1>Como criar tags e filtros de template customizados<a class=\"heading-anchor\" href=\"#how-to-create-custom-template-tags-and-filters\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>A linguagem de templates do Django vem com uma variedade de <a class=\"reference internal\" href=\"/pt-br/6.0/ref/templates/builtins/\"><span class=\"doc\">built-in tags e filtros</span></a> projetados para atender as necessidades da lógica de apresentação da sua aplicação. Mesmo assim, talvez precise de uma funcionalidade que não está coberta pelo conjunto das primitivas do template. É possível estender o engine de templates definindo tags e filtros customizados usando Python, e então torná-los disponíveis para seus templates usando a tag <a class=\"reference internal\" href=\"/pt-br/6.0/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 do código<a class=\"heading-anchor\" href=\"#code-layout\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>O lugar mais comum para especificar tags e filtros customizados é dentro de uma app Django. Se eles estão relacionados a uma app existente, faz sentido empacotá-los ali; se não eles podem ser adicionados a uma nova app. Quando uma app Django é adicionada ao <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>, qualquer tag que estiver definida em um local convencional descrito abaixo ficam automaticamente disponíveis para serem carregadas dentro dos templates.</p>\n<p>A app deve conter um diretório <code class=\"docutils literal notranslate\"><span class=\"pre\">templatetags</span></code>, no mesmo nível que o <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py`,</span> <span class=\"pre\">``views.py`,</span> <span class=\"pre\">etc.</span> <span class=\"pre\">Se</span> <span class=\"pre\">este</span> <span class=\"pre\">ainda</span> <span class=\"pre\">não</span> <span class=\"pre\">existe,</span> <span class=\"pre\">crie</span> <span class=\"pre\">-</span> <span class=\"pre\">não</span> <span class=\"pre\">esqueça</span> <span class=\"pre\">o</span> <span class=\"pre\">arquivo</span> <span class=\"pre\">``__init__.py</span></code> para ter certeza que o diretório é tratado como um pacote Python.</p>\n<aside class=\"admonition-development-server-won-t-automatically-restart admonition\">\n<p class=\"admonition-title\">O servidor de desenvolvimento não irá reiniciar automaticamente</p>\n<p>Depois de adicionar o módulo <code class=\"docutils literal notranslate\"><span class=\"pre\">templatags</span></code>, será preciso reiniciar o servidor antes que seja possível utilizar as tags ou filtros nos tempates.</p>\n</aside>\n<p>As tags e filtros personalizados irão ficar em um módulo dentro do diretório <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>templatetags`. O nome do arquivo do módulo é o nome que será usado para carregar as tags mais tarde, então tenha cuidado em escolher um nome que não conflite com tags e filtros customizados de outras apps.</p>\n<p>Por exemplo, se suas tags/filtros personalizados estão e um arquivo chamado <code class=\"docutils literal notranslate\"><span class=\"pre\">poll_extras.py</span></code>, então o layout do seu app se parecerá desta forma:</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>E no seu template você deveria usar o seguinte:</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>A app que contém a tag personalizada deve estar em <a class=\"reference internal\" href=\"/pt-br/6.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> para que a tag <a class=\"reference internal\" href=\"/pt-br/6.0/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> funcione. Essa é uma característica de segurança: isso permite servir código Python para muitas bibliotecas de template em uma única máquina servidora sem habilitar acesso cada instalação de Django.</p>\n<p>Não há limites de quantos módulos são colocados dentro do pacote <code class=\"docutils literal notranslate\"><span class=\"pre\">templatetags</span></code>. Apenas mantenha em mente que um comando <a class=\"reference internal\" href=\"/pt-br/6.0/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> irá carregar tags/filters para o nome do módulo Python, e não o nome da app.</p>\n<p>Para ser uma biblioteca de tags válida, o módulo deve conter uma variável do nível do módulo chamado <code class=\"docutils literal notranslate\"><span class=\"pre\">register</span></code> que é uma instância de <code class=\"docutils literal notranslate\"><span class=\"pre\">template.Library</span></code>, na qual todas as tags e filtros são registrados. Então, próximo ao topo do seu módulo, coloque o seguinte:</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>Um alternativa, é que módulos de tags de template podem ser registradas através do argumento <code class=\"docutils literal notranslate\"><span class=\"pre\">'libraries'</span></code> do <a class=\"reference internal\" href=\"/pt-br/6.0/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>. Isso é útil se você quer um “label” diferente para o módulo da tag de quando carregar os templates. Isso também habilita o registro de tags sem instalar a aplicação.</p>\n<aside class=\"admonition-behind-the-scenes admonition\">\n<p class=\"admonition-title\">Por trás das cenas.</p>\n<p>Para muito mais exemplos, leia o código fonte dos filtros e tags padrões do Django. eles estão em <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.0.x/django/template/defaultfilters.py\">django/template/defaultfilters.py</a> e <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.0.x/django/template/defaulttags.py\">django/template/defaulttags.py</a>, respectivamente.</p>\n<p>Para maiores informações sobre a tag <a class=\"reference internal\" href=\"/pt-br/6.0/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">load</span></code></a> tag, leia sua documentação</p>\n</aside>\n</section>\n<section id=\"writing-custom-template-filters\">\n<span id=\"howto-writing-custom-template-filters\"></span><h2>Escrevendo filtros de templates personalizados<a class=\"heading-anchor\" href=\"#writing-custom-template-filters\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Filtros customizados são funções Python que recebem um ou dois argumentos:</p>\n<ul class=\"simple\">\n<li><p>O valor da variável (input - de entrada) – não necessariamente uma string.</p></li>\n<li><p>O valor do argumento – este pode ter um valor padrão, ou ser deixado de fora.</p></li>\n</ul>\n<p>Por exemplo, no filtro <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">var|foo:&quot;bar&quot;</span> <span class=\"pre\">}}</span></code>, ao filtro <code class=\"docutils literal notranslate\"><span class=\"pre\">foo</span></code> seria passada a variável <code class=\"docutils literal notranslate\"><span class=\"pre\">var</span></code> e o argumento <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;bar&quot;</span></code>.</p>\n<p>Uma vez que a linguagem de template não fornece manipulação de  exceções, qualquer exceção vinda de um filtro de template será exposta como um erro de servidor. Sendo assim, funções de filtros devem evitar enviar exceções se houver um valor substituto razoável para retornar. No caso de uma entrada que representa claramente um bug em um template, enviar uma exceção talvez ainda seja melhor que uma falha silenciosa a qual esconde o bug.</p>\n<p>Aqui um exemplo de definição de filtro:</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>E aqui um exemplo de como aquele filtro poderia ser usado:</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>A maioria dos filtros não recebe argumentos. Neste caso, deixe o argumento fora da sua função:</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>Registrando filtros customizados<a class=\"heading-anchor\" href=\"#registering-custom-filters\"><span class=\"visually-hidden\">Link para este cabeçalho</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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Uma vez que tenha escrito sua definição do filtro, é preciso registrá-lo com sua instância de <code class=\"docutils literal notranslate\"><span class=\"pre\">Library</span></code>, para fazer com que esteja disponível para a linguagem de template do Django.</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>O Método <code class=\"docutils literal notranslate\"><span class=\"pre\">Library.filter()</span></code> recebe dois argumentos:</p>\n<ol class=\"arabic simple\">\n<li><p>O nome do filtro – uma string.</p></li>\n<li><p>A função de compilação – uma função Python (não o nome da função como uma string)</p></li>\n</ol>\n<p>Você pode, ao invés, usar <code class=\"docutils literal notranslate\"><span class=\"pre\">register.filter()</span></code> como um decorador:</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>Se deixar de passar o argumento <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>, como no segundo exemplo acima, o Django irá usar o nome da função como nome do filtro.</p>\n<p>Finalmente,  <code class=\"docutils literal notranslate\"><span class=\"pre\">register.filter()</span></code> também aceita três argumentos nomeados, <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">needs_autoescape</span></code>, e <code class=\"docutils literal notranslate\"><span class=\"pre\">expects_localtime</span></code>. Estes argumentos são descrito em  <a class=\"reference internal\" href=\"#filters-auto-escaping\"><span class=\"std std-ref\">filters and auto-escaping</span></a> e <a class=\"reference internal\" href=\"#filters-timezones\"><span class=\"std std-ref\">filters and time zones</span></a> abaixo.</p>\n</section>\n<section id=\"template-filters-that-expect-strings\">\n<h3>Filtros de templates que recebem strings<a class=\"heading-anchor\" href=\"#template-filters-that-expect-strings\"><span class=\"visually-hidden\">Link para este cabeçalho</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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Se você está escrevendo um filtro de template que somente aceita uma string como primeiro argumento, deveria usar o decorador <code class=\"docutils literal notranslate\"><span class=\"pre\">stringfilter</span></code>. Isso irá converter um objeto para seu valor string antes de ser passado pela sua função:</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>Desta maneira, você será capaz de passar, vamos dizer, um inteiro para este filtro, e isso não irá causar um <code class=\"docutils literal notranslate\"><span class=\"pre\">AttributeError</span></code> (porque inteiros não possuem os métodos <code class=\"docutils literal notranslate\"><span class=\"pre\">lower()</span></code>).</p>\n</section>\n<section id=\"filters-and-auto-escaping\">\n<span id=\"filters-auto-escaping\"></span><h3>Filtros e auto-escaping<a class=\"heading-anchor\" href=\"#filters-and-auto-escaping\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Quando estiver escrevendo um filtro customizado, reflita sobre como o filtro irá interagir com o comportamento de auto escape do Django. Note que dois tipos de cadeias de caracteres podem ser passados dentro do código do template.</p>\n<ul>\n<li><p><strong>Raw strings</strong> são as cadeias de caracteres nativas do Python. Na saída, elas são escapadas se o auto escapamento estiver ativado, caso contrário, são apresentadas sem mudanças.</p></li>\n<li><p><strong>Safe strings</strong> são strings que tenham sido marcadas como seguras para futuros “escaping” no tempo de saída. Qualquer “escaping” necessário já foi feito. Eles são comumente usados para saídas que contenham HTML puro que se destina a ser interpretado como estão do lado do cliente.</p>\n<p>Internamente, estas strings são do tipo <a class=\"reference internal\" href=\"/pt-br/6.0/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>. Você pode testá-las utilizando como códigos como:</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>Código de filtros de templates caem em um das duas situações:</p>\n<ol class=\"arabic\">\n<li><p>Seu filtro não introduz qualquer caracter HTML inseguro (<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> or <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;</span></code>) no resultado que ainda não foi apresentado. Neste caso, você pode deixar o Django cuidar de toda a manipulação do “auto-espacaping” pra você. Tudo o que precisa é definir a “flag” ìs_safe``para ``True` quando registrar a função do filtro, como:</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>A “flag” diz ao Django que se uma string “segura” é passada para seu filtro, o resultado ainda será “seguro” e se uma string não segura é passada, Django irá automaticamente fazer o “escape”, se necessário.</p>\n<p>Você pode entender isso como “este filtro é seguro – ele não introduz qualquer possibilidade de HTML não seguro”</p>\n<p>A razão da necessidade do <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code> é porque existem muitas operações de string normais que irão transformar um objeto <code class=\"docutils literal notranslate\"><span class=\"pre\">SafeData</span></code> de volta em um objeto <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code> normal e, ao invés de tentar capturar eles todos, o que seria muito difícil, Django repara o dano depois que o filtro é completado.</p>\n<p>Por exemplo, suponha que tenha um filtro que adiciona a string <code class=\"docutils literal notranslate\"><span class=\"pre\">xx``ao</span> <span class=\"pre\">final</span> <span class=\"pre\">de</span> <span class=\"pre\">uma</span> <span class=\"pre\">entrada.</span> <span class=\"pre\">Uma</span> <span class=\"pre\">vez</span> <span class=\"pre\">que</span> <span class=\"pre\">isso</span> <span class=\"pre\">não</span> <span class=\"pre\">introduz</span> <span class=\"pre\">nenhum</span> <span class=\"pre\">caracter</span> <span class=\"pre\">HTML</span> <span class=\"pre\">perigoso</span> <span class=\"pre\">para</span> <span class=\"pre\">o</span> <span class=\"pre\">resultado</span> <span class=\"pre\">(além</span> <span class=\"pre\">daqueles</span> <span class=\"pre\">que</span> <span class=\"pre\">já</span> <span class=\"pre\">estão</span> <span class=\"pre\">presentes),</span> <span class=\"pre\">você</span> <span class=\"pre\">deveria</span> <span class=\"pre\">marcar</span> <span class=\"pre\">seu</span> <span class=\"pre\">filtro</span> <span class=\"pre\">como</span> <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>Quando o filtro é usado em um template onde a auto-substituição está habilitada, o Django irá fazer a substituição na saída sempre que a entrada ainda não estiver marcada como “safe”.</p>\n<p>Por padrão, <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code> é <code class=\"docutils literal notranslate\"><span class=\"pre\">falso</span></code>, e você pode omiti-lo em qualquer filtro onde ele não é requerido.</p>\n<p>Tenha cuidado quando estiver decidindo se o seu filtro realmente irá deixar strings seguras como “safe”. Se estiver “removendo” caracteres, poderia deixar  tags HTML ou entidades incompletas no resultado. Por exemplo, removendo um <code class=\"docutils literal notranslate\"><span class=\"pre\">&gt;``de</span> <span class=\"pre\">uma</span> <span class=\"pre\">entrada</span> <span class=\"pre\">poderia</span> <span class=\"pre\">tornar</span> <span class=\"pre\">``&lt;a&gt;</span></code> em um <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;a</span></code>, que poderia ser necessário fazer o “escape” na saída para evitar causar problemas. Similar a isso, removendo um ponto-e-vírgula (<code class=\"docutils literal notranslate\"><span class=\"pre\">;</span></code>) pode tornar um <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;</span> <span class=\"pre\">amp;</span></code> em um  <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;</span> <span class=\"pre\">amp</span></code> , o qual não é mais uma entidade válida e assim precisa realizar o “escape”. A maioria dos casos nem chegarão perto de ser complicados assim, mas fique de olho para qualquer problema como este quando revisar seu código.</p>\n<p>Marking a filter <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code> will coerce the filter’s return value to\na string. If your filter should return a boolean or other non-string\nvalue, marking it <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code> will probably have unintended\nconsequences (such as converting a boolean False to the string\n‘False’).</p>\n</li>\n<li><p>Uma alternativa, o código do seu filtro pode manualmente cuidar das substituições necessárias. Isso é necessário quando adicionar uma marcação HTML ao resultado. Você quer marcar a saída como segura de substituições posteriores,  então suas marcação HTML não será substituída, e precisará tratar a entrada por conta própria.</p>\n<p>Para marcar a saída como saída segura, use <a class=\"reference internal\" href=\"/pt-br/6.0/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>Porém, tenha cuidado. É necessário mais que marcar a saída como segura. É necessário ter certeza que isso <em>é</em> realmente seguro, e o que fará depende se a auto-substituição está fazendo efeito. A idéia é escrever filtros que podem operar em templates onde o auto-escaping está ligado ou desligado de modo a tornar as coisas mais fáceis para os autores de templates.</p>\n<p>Para que seu filtro saiba o estado corrente do estado da auto-substituição, defina a flag <code class=\"docutils literal notranslate\"><span class=\"pre\">needs_autoescape</span></code> como <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> quando registrar o filtro. (se não especificar esa flag, seu valor padrão é <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>). Esta flag dia ao Django que sua função do filtro quer que seja passado um argumento extra, chamado <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape`,</span> <span class=\"pre\">que</span> <span class=\"pre\">é</span> <span class=\"pre\">``True</span></code> se está em efeito e <code class=\"docutils literal notranslate\"><span class=\"pre\">False``caso</span> <span class=\"pre\">contrário.</span> <span class=\"pre\">É</span> <span class=\"pre\">recomendado</span> <span class=\"pre\">definir</span> <span class=\"pre\">o</span> <span class=\"pre\">padrão</span> <span class=\"pre\">do</span> <span class=\"pre\">parâmetro</span> <span class=\"pre\">``autoescape</span></code> para <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, então se a função for chamado de um código Python esta terá a substituição habilitada por padrão.</p>\n<p>Por exemplo, vamos escrever um filtro que enfatiza o primeiro caracter de uma string:</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>A flag <code class=\"docutils literal notranslate\"><span class=\"pre\">needs_autoescape</span></code> e o argumento nomeado <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape</span></code> implicam que nossa função irá sabe se a substituição automática está efetiva quando o filtro for chamado. Usamos o <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape</span></code> para decidir se o data de entrada precisa ser acessado através do <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.html.conditional_escape</span></code> ou não. (No último caso, usamos a função identidade como função de “substituição”). A função <code class=\"docutils literal notranslate\"><span class=\"pre\">conditional_escape()</span></code> é como <code class=\"docutils literal notranslate\"><span class=\"pre\">escape()</span></code> exceto que somente substitui a entrada que <strong>não</strong> é instância de  <code class=\"docutils literal notranslate\"><span class=\"pre\">SafeData</span></code>. Se uma instância de <code class=\"docutils literal notranslate\"><span class=\"pre\">SafeData</span></code> é passada para a <code class=\"docutils literal notranslate\"><span class=\"pre\">conditional_escape()</span></code>, o dado é retornado sem mudanças.</p>\n<p>Finalmente, no exemplo acima, relembramos de marcar resultados como seguros assim que o HTML é inserido diretamente no template sem outras substituições.</p>\n<p>Não precisa se preocupar com a flag <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code>  neste caso (embora inclui-la não faria nenhum mal). Mesmo que trate manualmente a auto-substituição e retorne uma string segura, a flag <code class=\"docutils literal notranslate\"><span class=\"pre\">is_safe</span></code> não alterará nada de nenhum modo.</p>\n</li>\n</ol>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Aviso</p>\n<p>Evitando vulnerabilidade XSS quando reusar filtros embutidos.</p>\n<p>Os fiiltros embutidos do Django tem por padrão <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape=True</span></code> para que receba propriamente o comportamento da auto-substituição e evite a vulnerabilidade de “cross-site” .</p>\n<p>Em versões antigas do Djagno, tenha cuidado quando reutilizar filtros embutidos como <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape</span></code> definidos por padrão como <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. Será necessário passar <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape=True</span></code> para ter a auto-substituição.</p>\n<p>Por exemplo, se quer escrever um filtro personalizado chamado <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>urlize_and_linebreaks``que combine os filtros <a class=\"reference internal\" href=\"/pt-br/6.0/ref/templates/builtins/#std-templatefilter-urlize\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">urlize</span></code></a> e <a class=\"reference internal\" href=\"/pt-br/6.0/ref/templates/builtins/#std-templatefilter-linebreaksbr\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">linebreaksbr</span></code></a>, o filtro deveria parecer com:</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>Então:</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>seria equivalente a:</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>Filtros e fusos horários<a class=\"heading-anchor\" href=\"#filters-and-time-zones\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Se escrever filtros personalizados que operam objetos  <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(em Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime</span></code></a>, geralmente registra-se com a flag <code class=\"docutils literal notranslate\"><span class=\"pre\">expects_localtime``definido</span> <span class=\"pre\">como</span> <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>Quando esta flag está definida, se o primeiro argumento do seu filtro é uma date-time que leva em consideração o fuso-horário, o Django irá convertê-lo para o fuso-horário corrente antes de passa-lo para o filtro quando apropriado, de acordo com <a class=\"reference internal\" href=\"/pt-br/6.0/topics/i18n/timezones/#time-zones-in-templates\"><span class=\"std std-ref\">rules for time zones conversions in templates</span></a>.</p>\n</section>\n</section>\n<section id=\"writing-custom-template-tags\">\n<span id=\"howto-writing-custom-template-tags\"></span><h2>Escrevendo tags de templates personalizadas.<a class=\"heading-anchor\" href=\"#writing-custom-template-tags\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Tags são mais complexas que filtros, porque as tags podem fazer qualquer coisa. Django fornece inúmeros atalhos para fazer com que a escrita de várias tags seja mais fácil. Primeiro iremos explorar estes atalhos, e então explicar como escrever uma tag do início  para aqueles casos em que os atalhos não são poderosos o suficiente.</p>\n<section id=\"simple-tags\">\n<span id=\"howto-custom-template-tags-simple-tags\"></span><h3>Tags simples<a class=\"heading-anchor\" href=\"#simple-tags\"><span class=\"visually-hidden\">Link para este cabeçalho</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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Muitas tags de templates recebem inúmeros argumentos – strings ou variáveis de templates – e retornam um resultado depois de fazer algum processamento baseado somente nos argumentos de entrada e alguma informação externa. Por exemplo, uma tag <code class=\"docutils literal notranslate\"><span class=\"pre\">current_time</span></code> aceitaria uma string de formato e retorna a hora como uma string formatada de acordo.</p>\n<p>Para facilitar a criação destes tipos de tags, Django fornece uma função de auxílio, <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_tag</span></code>. Essa função, a qual é um método de <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.Library</span></code>, tem uma função que recebe qualquer número de parâmetros, empacota isso em uma função <code class=\"docutils literal notranslate\"><span class=\"pre\">renderizadora</span></code> junto com os “bits” mencionados acima e o registra com o sistema de templates.</p>\n<p>Nossa função <code class=\"docutils literal notranslate\"><span class=\"pre\">current_time</span></code> poderia então ser escrita assim:</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>Algumas coisas para perceber sobre a função de auxílio <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_tag</span></code>:</p>\n<ul class=\"simple\">\n<li><p>A checagem do número de arrgumentos, etc, já foi feito na hora em que a função é chamada, então não precisamos faze-lo.</p></li>\n<li><p>As aspas ao redor do argumento (se existem) já foram retiradas, então recebemos uma string simples.</p></li>\n<li><p>Se o argumento era uma variável de template, é passada par a nossa função o valor atual da variável, e não a própria variável.</p></li>\n</ul>\n<p>Diferente de outras ferramentas de tag,  <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_tag</span></code> passa sua saida através do  <a class=\"reference internal\" href=\"/pt-br/6.0/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> se o contexto do tempte está no modo auto-substituição, para assegurar o HTML e proteger da vulnerabilidade XSS.</p>\n<p>Se substituições adicionais não são desejadas, é necessário usar <a class=\"reference internal\" href=\"/pt-br/6.0/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>  se você tem a certeza absoluta que seu código não contém vulnerabilidade XSS. Para construir pequenos fragmentos de HTML, é fortemente recomendado usar <a class=\"reference internal\" href=\"/pt-br/6.0/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> ao invés de <code class=\"docutils literal notranslate\"><span class=\"pre\">mark_safe()</span></code></p>\n<p>Se a template tag precisa acessar o contexto corrente, você pode usar o argumento <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context</span></code> quando registrá-la:</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>Perceba que o primeiro argumento <strong>deve</strong> ser chamado “context”.</p>\n<p>Para maiores informações sobre como a opção <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context</span></code> funciona, veja a seção <a class=\"reference internal\" href=\"#howto-custom-template-tags-inclusion-tags\"><span class=\"std std-ref\">inclusion tags</span></a>.</p>\n<p>Se você precisar renomear a tag, você pode fornecer um nome personalizado para ele:</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>As funções <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_tag</span></code> aceitam qualquer número de argumentos posicionais ou nomeados. Por exemplo:</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>Então no template qualquer número de argumentos, separados por espaços podem ser passados para a atg de template. Como em Python, os valores para argumentos nomeados são definidos usando o sinal de igua (”=”) e devem ser fornecidos depois dos argumentos posicionais. Por exemplo:</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>É possível armazenar os resultados da tag em uma variável de template ao invés de enviar para a saída diretamente. Isso é feito utilizando o argumento <code class=\"docutils literal notranslate\"><span class=\"pre\">as</span></code> seguido de um nome de variável. Fazendo isso é possível posicionar o conteúdo onde você achar cabido.</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>Simple block tags<a class=\"heading-anchor\" href=\"#simple-block-tags\"><span class=\"visually-hidden\">Link para este cabeçalho</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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>When a section of rendered template needs to be passed into a custom tag,\nDjango provides the <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_block_tag</span></code> helper function to accomplish this.\nSimilar to <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>, this function accepts\na custom tag function, but with the additional <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code> argument, which\ncontains the rendered content as defined inside the tag. This allows dynamic\ntemplate sections to be easily incorporated into custom tags.</p>\n<p>For example, a custom block tag which creates a chart could look like this:</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>The <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code> argument contains everything in between the <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">chart</span> <span class=\"pre\">%}</span></code>\nand <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endchart</span> <span class=\"pre\">%}</span></code> tags:</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>If there are other template tags or variables inside the <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code> block,\nthey will be rendered before being passed to the tag function. In the example\nabove, <code class=\"docutils literal notranslate\"><span class=\"pre\">request.user</span></code> will be resolved by the time <code class=\"docutils literal notranslate\"><span class=\"pre\">render_chart</span></code> is\ncalled.</p>\n<p>Block tags are closed with <code class=\"docutils literal notranslate\"><span class=\"pre\">end{name}</span></code> (for example, <code class=\"docutils literal notranslate\"><span class=\"pre\">endchart</span></code>). This can\nbe customized with the <code class=\"docutils literal notranslate\"><span class=\"pre\">end_name</span></code> parameter:</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>Which would require a template definition like this:</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>A few things to note about <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_block_tag</span></code>:</p>\n<ul class=\"simple\">\n<li><p>The first argument must be called <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code>, and it will contain the\ncontents of the template tag as a rendered string.</p></li>\n<li><p>Variables passed to the tag are not included in the rendering context of the\ncontent, as would be when using the <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">with</span> <span class=\"pre\">%}</span></code> tag.</p></li>\n</ul>\n<p>Just like <a class=\"reference internal\" href=\"#howto-custom-template-tags-simple-tags\"><span class=\"std std-ref\">simple_tag</span></a>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">simple_block_tag</span></code>:</p>\n<ul class=\"simple\">\n<li><p>Validates the quantity and quality of the arguments.</p></li>\n<li><p>Strips quotes from arguments if necessary.</p></li>\n<li><p>Escapes the output accordingly.</p></li>\n<li><p>Supports passing <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context=True</span></code> at registration time to access\ncontext. Note that in this case, the first argument to the custom function\n<em>must</em> be called <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code> must follow.</p></li>\n<li><p>Supports renaming the tag by passing the <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> argument when registering.</p></li>\n<li><p>Supports accepting any number of positional or keyword arguments.</p></li>\n<li><p>Supports storing the result in a template variable using the <code class=\"docutils literal notranslate\"><span class=\"pre\">as</span></code> variant.</p></li>\n</ul>\n<aside class=\"admonition-content-escaping admonition\">\n<p class=\"admonition-title\">Content Escaping</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">simple_block_tag</span></code> behaves similarly to <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_tag</span></code> regarding\nauto-escaping. For details on escaping and safety, refer to <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_tag</span></code>.\nBecause the <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code> argument has already been rendered by Django, it is\nalready escaped.</p>\n</aside>\n<section id=\"a-complete-example\">\n<h4>A complete example<a class=\"heading-anchor\" href=\"#a-complete-example\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Consider a custom template tag that generates a message box that supports\nmultiple message levels and content beyond a simple phrase. This could be\nimplemented using a <code class=\"docutils literal notranslate\"><span class=\"pre\">simple_block_tag</span></code> as follows:</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>When combined with a minimal view and corresponding template, as shown here:</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></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>The following HTML is produced as the rendered output:</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>Tags de inclusão<a class=\"heading-anchor\" href=\"#inclusion-tags\"><span class=\"visually-hidden\">Link para este cabeçalho</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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Outro tipo de tag de template é o tipo que mostra alguns dados renderizados por <em>outro</em> template. Por exemplo, a interface do Admin do Django usa tags de tempate para mostrar os botões ao longo do final das páginas de formulários “add/change”. Esses botões sempre parecem os mesmos, mas o link de destino mudam dependendo do objeto sendo editado – então são um perfeito caso para usar um template pequeno que é preenchido com detalhes do objeto atual. (No caso do Admin, essa é a tag <code class=\"docutils literal notranslate\"><span class=\"pre\">submit_row</span></code>.)</p>\n<p>Este tipo de Tag são chamadas “tags de inclusão”</p>\n<p>Escrever tags de inclusão é provavelmente melhor demonstrado através de exemplos. Vamos escrever uma Tag que devolve uma lista de opções para um dado objeto <code class=\"docutils literal notranslate\"><span class=\"pre\">Poll</span></code>, tal como o que foi criado no <a class=\"reference internal\" href=\"/pt-br/6.0/intro/tutorial02/#creating-models\"><span class=\"std std-ref\">tutorials</span></a>. Usaremos a tag assim:</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>…e a saída será algo como:</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>Primeiro defina a função que recebe os argumentos e produz um dicionário de dados para o resultado. O ponto importante aqui é que precisamos somente retornar um dicionário, não algo mais complexo. Isso será usado como um contexto para o fragmento de template. Exemplo:</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>Depois, criamos o template que irá renderizar a saída da tag. Este template é uma característica fixa da tag: o autor da tag especifica isso, não o designer de template. Seguindo o exemplo, o template é muito simples.</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>Agora, crie e registre a tag de inclusão chamando o método <code class=\"docutils literal notranslate\"><span class=\"pre\">inclusion_tag()</span></code> em um objeto do tipo <code class=\"docutils literal notranslate\"><span class=\"pre\">Library</span></code>. Seguindo nosso exemplo, se o exemplo acima é um arquivo chamado <code class=\"docutils literal notranslate\"><span class=\"pre\">results.html</span></code> em um diretório que é procurado pelo template loader, nós regitramos a tag assim:</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>Alternativamente é possível registrar a tag de inclusão usando uma instância de <a class=\"reference internal\" href=\"/pt-br/6.0/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>:</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>…quando criar a função pela primeira vez.</p>\n<p>Algumas vezes, sua tag de inclusão requer um número grande de argumentos, tornando uma dor de cabeça para autores dos templates passar todos os argumentos e lembrar sua ordem. Para resolver isso, o Django fornece uma opção <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context</span></code> para tags de inclusão. Se o especificado o <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context</span></code> na criação da tag de template, a tag não terá argumentos requeridos, e a função Python implícita terá um argumento – o contexto do template quando a tag foi chamada.</p>\n<p>Por exemplo, digamos que esteja escrevendo uma tag de inclusão que sempre será usada em um contexto que contém as variásveis <code class=\"docutils literal notranslate\"><span class=\"pre\">home_link</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">home_title</span></code> que apontam de volta para a página principal. Aqui como a  função Python deveria parecer:</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>Repare que o primeiro parâmetro para a função <em>deve</em> ser chamado de <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code>.</p>\n<p>Na linha  <code class=\"docutils literal notranslate\"><span class=\"pre\">register.inclusion_tag()</span></code>, especificamos o <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context=True</span></code> e o nome do template. Aqui o que o template <code class=\"docutils literal notranslate\"><span class=\"pre\">link.html</span></code> deve se parecer:</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>Então, qualquer momento que queira usar a tag personalizada, carregue sua biblioteca e chame-a sem nenhum argumento, como:</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>Repare que quando estiver usando  <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context=True</span></code>, não tem necessidade de passar argumentos para a tag de template. Esta tem acessa o contexto automaticamente.</p>\n<p>O parâmetro padrão para <code class=\"docutils literal notranslate\"><span class=\"pre\">takes_context</span></code> é <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. Quando definido como <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, para tag é passado o objeto contexto, como neste exemplo. Este é a única diferença entre este caso e o exemplo <code class=\"docutils literal notranslate\"><span class=\"pre\">inclusion_tag</span></code> anterior.</p>\n<p>Funções <code class=\"docutils literal notranslate\"><span class=\"pre\">inclusion_tag</span></code> podem aceitar qualquer número de argumentos posicionais ou nomeados. Por exemplo:</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>Então no template qualquer número de argumentos, separados por espaços podem ser passados para a atg de template. Como em Python, os valores para argumentos nomeados são definidos usando o sinal de igua (”=”) e devem ser fornecidos depois dos argumentos posicionais. Por exemplo:</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>Tags personalizadas avançadas<a class=\"heading-anchor\" href=\"#advanced-custom-template-tags\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As vezes as funções básicas para criação das tags de template não são o suficiente. Não se preocupe, o Django lhe dá completo acesso as “coisas”internas requeridas para construir uma tag de template do zero.</p>\n</section>\n<section id=\"a-quick-overview\">\n<h3>Um rápida visão geral<a class=\"heading-anchor\" href=\"#a-quick-overview\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>O sistema de templates funciona em um processo de 2 passos.: compilação e renderização. Para definir uma tag de template personalizada, é necessário especificar como a compilação funcionar e como a renderização funciona.</p>\n<p>When Django compiles a template, it splits the raw template text into <em>nodes</em>.\nEach node is an instance of <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.Node</span></code> and has a <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code>\nmethod. A compiled template is a list of <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> objects. When you call\n<code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> on a compiled template object, the template calls <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> on\neach <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> in its node list, with the given context. The results are all\nconcatenated together to form the output of the template.</p>\n<p>Então, para definir uma tag de template personalizada, especifique como a tag de template original é convertida em um <code class=\"docutils literal notranslate\"><span class=\"pre\">Nó</span></code> (a função de compilação), e o que o método <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>render()``do nó faz.</p>\n</section>\n<section id=\"writing-the-compilation-function\">\n<h3>Escrevendo a função de compilação<a class=\"heading-anchor\" href=\"#writing-the-compilation-function\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Para cada tag de template que o analisador de templates encontra, ele chama uma função Python com o conteúdo da tag e o próprio objeto analisador. Essa função é responsável por retornar uma instância de <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> baseada no conteúdo da tag.</p>\n<p>Por exemplo, vamos escrever toda a implementação de uma simples tag de template, <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">current_time</span> <span class=\"pre\">%}</span></code>, que mostra a data/hora corrente., formatada de acordo com um parâmetro passado na tag, na syntax <a class=\"reference external\" href=\"https://docs.python.org/3/library/time.html#time.strftime\" title=\"(em Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">strftime()</span></code></a>. É uma boa idéia decidir a syntax antes de qualquer outro. No nosso caso, vamos dizer que a tag deveria ser assim:</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>O analisador para essa função deve pegar o parâmetro e criar um objeto <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=\"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>Notas:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">parser</span></code> é o objeto analisador do template. Nós não precisamos dele neste exemplo.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">token.contents</span></code> é uma string com o conteúdo original da tag, No nosso exemplo, isso é <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>O método <code class=\"docutils literal notranslate\"><span class=\"pre\">token.split_contents()</span></code> separa os argumentos por espaços enquanto mantém strings entre aspas, juntas. Mais direto o <code class=\"docutils literal notranslate\"><span class=\"pre\">token.contents.split()</span></code> não seria tão robusto já que ingenuamente dividiria <em>todos</em> os espaços, incluindo aqueles dentro de aspas. É uma boa idéia usar sempre o <code class=\"docutils literal notranslate\"><span class=\"pre\">token.split_contents()</span></code>.</p></li>\n<li><p>Essa função é responsável for informar o <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.TemplateSyntaxError</span></code>, com mensagens de ajuda, para qualquer erro de sintaxe.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">TemplateSyntaxError</span></code> exceptions use the <code class=\"docutils literal notranslate\"><span class=\"pre\">tag_name</span></code> variable.\nDon’t hardcode the tag’s name in your error messages, because that\ncouples the tag’s name to your function. <code class=\"docutils literal notranslate\"><span class=\"pre\">token.contents.split()[0]</span></code>\nwill <em>always</em> be the name of your tag – even when the tag has no arguments.</p></li>\n<li><p>A função retorna um <code class=\"docutils literal notranslate\"><span class=\"pre\">CurrentTimeNode</span></code> com tudo que o nó precisa para conhecer sobre sua tag. Neste caso, ele apenas passa o argumento – <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>. As aspas (direita e esquerda) da tag de template estão removidas em <code class=\"docutils literal notranslate\"><span class=\"pre\">format_string[1:-1]</span></code>.</p></li>\n<li><p>O analisador é muito baixo nível. Os desenvolvedores do Django experimentaram escrever pequenos frameworks baseados no sistema analisador (“parser”), usando técnicas como a gramática EBNF, mas estes experimentos tornaram o motor de template muito lento. É baixo-nível porque é rápido.</p></li>\n</ul>\n</section>\n<section id=\"writing-the-renderer\">\n<h3>Escrevendo o “renderizador”<a class=\"heading-anchor\" href=\"#writing-the-renderer\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>O segundo passo para escrever uma tag personalizada é definir uma subclasse de  <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> que tenha um método <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code>.</p>\n<p>Continuando o exemplo acima, precisamso definir <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>Notas:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> recebe o <code class=\"docutils literal notranslate\"><span class=\"pre\">format_string</span></code> do <code class=\"docutils literal notranslate\"><span class=\"pre\">do_current_time()</span></code>. Sempre passar opções/parametros/argumentos para um <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> através de seu <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code>.</p></li>\n<li><p>O método <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> é onde o trabalho realmente acontece</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> deve geralmente falhar silenciosamente, particularmente no ambiente de produção. Em alguns casos porém, particularmente se  <code class=\"docutils literal notranslate\"><span class=\"pre\">context.template.engine.debug</span></code> for <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, este método pode indicar uma exceção para ficar mais fácil debugar. Por exemplo, muitas tags do core inviam   <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.TemplateSyntaxError</span></code> se eles receberem o número errado ou tipo de argumentos.</p></li>\n</ul>\n<p>Por último, este desacomplamento entre compilação e renderização resulta em um sistema de template mais eficiente, porque o template pode renderizar múltiplos contextos ser ter que ser analisado (“parsed”)  múltiplas vezes.</p>\n</section>\n<section id=\"auto-escaping-considerations\">\n<span id=\"tags-auto-escaping\"></span><h3>Considerações sobre auto-substituição<a class=\"heading-anchor\" href=\"#auto-escaping-considerations\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>A saída da tag de template <strong>não</strong> passa automaticamente pelos filtros de auto-escaping (com exceção do <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> , como descrito acima). Porém, ainda existem algumas coisas para se ter em mente ao escrever uma tag de template.</p>\n<p>Se a função <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> do seu template armazena o resultado em uma variável de contexto (ao invés de retornar o resultado em uma string), ele deve tomar o cuidado de chamar <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>mark_safe()``se apropriado. Quando a variável é renderizada, ela será afetada pela definição do auto-substituição em efeito na hora, então o conteúdo que deve ser ignorado em futuras substituições deve ser marcado como tal.</p>\n<p>Também, se sua tag cria um novo contexto para realizar algum sub renderização, defina o atributo de auto-substituição para o valor do contexto corrente. O método <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> da classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Context</span></code> recebe um parâmetro chamado <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape</span></code> que pode ser usado para este propósito. Por exemplo:</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>Isso não é uma situação muito comum, mas é útil se você está renderizando você mesmo o template. Por exemplo:</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>Se negligenciássemos ao passar o valor no corrente <code class=\"docutils literal notranslate\"><span class=\"pre\">context.autoescape</span></code> para ao novo <code class=\"docutils literal notranslate\"><span class=\"pre\">Context</span></code> neste exemplo, os resultados seriam <em>sempre</em> automaticamente substituidos, o que pode não ser o comportamento desejável se a tg de template for usada dentro de um bloco  <a class=\"reference internal\" href=\"/pt-br/6.0/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> .</p>\n</section>\n<section id=\"thread-safety-considerations\">\n<span id=\"template-tag-thread-safety\"></span><h3>Considerações sobre segurança de “thread”<a class=\"heading-anchor\" href=\"#thread-safety-considerations\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Uma vez que o nó tenha sido analisado, seu método <code class=\"docutils literal notranslate\"><span class=\"pre\">render</span></code> pode ser chamado qualquer número de vezes. Uma vez que o Django roda algumas vezes em ambientes multi-threaded, um nó pode ser renderizado simultaneamente com diferentes contextos em resposta a dois requests diferentes. Por isso, é importante que suas tags de templates são segurara para “threads”.</p>\n<p>Para ter certeza que sua tag de template é segura para rodar em threads, nunca deve armazenar informação no próprio nó. Por exemplo, Django fornece a template tag <a class=\"reference internal\" href=\"/pt-br/6.0/ref/templates/builtins/#std-templatetag-cycle\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">cycle</span></code></a> que alterna os intens de uma lista de strings cada vez que é renderizada:</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>Uma implementação ingênua do <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode</span></code> talvez se pareça como algo assim:</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>Mas, suponha que temos dois templates renderizando o pedaço de template acima ao mesmo tempo.</p>\n<ol class=\"arabic simple\">\n<li><p>Thread 1 realiza sua primeira iteração, <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode.render()</span></code> retorna ‘row1’</p></li>\n<li><p>Thread 2 realiza sua primeira iteração, <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode.render()</span></code> retorna ‘row2’</p></li>\n<li><p>Thread 1 realiza sua segunda iteração, <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode.render()</span></code> retorna ‘row2’</p></li>\n<li><p>Thread 2 realiza sua segunda iteração, <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode.render()</span></code> retorna ‘row2’</p></li>\n</ol>\n<p>O CycleNode está iterando, más iterando globalmente. Tanto quanto Thread 1 e Thread 2 são problemas, eles retornam sempre o mesmo valor. Isso não é obviamente o que queremos !</p>\n<p>Para resolver o problema, o Django provê o <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context</span></code> que associado com o <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code> do  template que está correntemente sendo renderizado. O  <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context</span></code> se comporta como um dicionário Python, e deve ser usado para armazenar os estados do <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> entre chamadas do método <code class=\"docutils literal notranslate\"><span class=\"pre\">render</span></code>.</p>\n<p>Vamos refatorar nosso implementação do <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode</span></code>  para usar o <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>Note que é perfeitamente seguro armazenar informação global que não irá se alterar através da vida do <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> como um atributo. No caso do <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode</span></code>, o argumento <code class=\"docutils literal notranslate\"><span class=\"pre\">cyclevars</span></code> não muda depois que <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> é instanciado., então não precisamos colocá-lo no <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context</span></code>. Mas informações do estado que é específica para o template que está sendo renderizado no momento, como a citeração corrente do <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode</span></code>, deve ser armazenado no <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\">Nota</p>\n<p>Note como usamos o <code class=\"docutils literal notranslate\"><span class=\"pre\">self</span></code> como escopo para a informação específica do <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNode</span></code> dentro do <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context</span></code>. Pode haver múltiplos <code class=\"docutils literal notranslate\"><span class=\"pre\">CycleNodes</span></code> em um dado template, então é preciso ter cuidado para não conflitar outra informação de estado do nó.  A maneira mais fácil de fazer isso é sempre usar <code class=\"docutils literal notranslate\"><span class=\"pre\">self</span></code> como chave dentro do <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context</span></code>. Se está acompanhando várias variáveis de estado faça do <code class=\"docutils literal notranslate\"><span class=\"pre\">render_context[self]</span></code> um dicionário.</p>\n</aside>\n</section>\n<section id=\"registering-the-tag\">\n<h3>Registrando a tag<a class=\"heading-anchor\" href=\"#registering-the-tag\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Finalmente, registre a tag com sua instancia de <code class=\"docutils literal notranslate\"><span class=\"pre\">Library</span></code> do modelo, como explicado em <a class=\"reference internal\" href=\"#howto-writing-custom-template-tags\"><span class=\"std std-ref\">writing custom template filters</span></a> acima. Exemplo:</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>O método <code class=\"docutils literal notranslate\"><span class=\"pre\">tag()</span></code> recebe dois argumentos:</p>\n<ol class=\"arabic simple\">\n<li><p>O nome da template tag – uma string. Se não for informado, o nome da função de compilação será usado.</p></li>\n<li><p>A função de compilação – uma função Python (não o nome da função como uma string)</p></li>\n</ol>\n<p>Assim como o registro de um filtro, também é possível usá-lo como “decorator”:</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>Se não informado o argumento <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>, como no segundo exemplo acima, o Django irá usar o nome da função como nome da tag.</p>\n</section>\n<section id=\"passing-template-variables-to-the-tag\">\n<h3>Passando variáveis de template para a tag.<a class=\"heading-anchor\" href=\"#passing-template-variables-to-the-tag\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Embora você possa passar qualquer número de argumentos para uma tag de template usando <code class=\"docutils literal notranslate\"><span class=\"pre\">token.split_contents()</span></code>, os argumentos são todos “desempacotados” como strings literais. Um pouco mais de trabalho é requerido para que passe o conteúdo dinamicamente (uma variável de template) para uma tag de template como argumento.</p>\n<p>Enquando os exemplos anteriores formataram a hora corrente como string e retornaram uma string, suponha que queira passar um <a class=\"reference internal\" href=\"/pt-br/6.0/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> de um objeto e a template tag formate o date-time:</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>Inicialmente, <code class=\"docutils literal notranslate\"><span class=\"pre\">token.split_contents()</span></code> irá retornar três valores:</p>\n<ol class=\"arabic simple\">\n<li><p>A tag chamada <code class=\"docutils literal notranslate\"><span class=\"pre\">format_time</span></code>.</p></li>\n<li><p>A string <code class=\"docutils literal notranslate\"><span class=\"pre\">'blog_entry.date_updated'</span></code> (sem as aspas).</p></li>\n<li><p>A string de formatação <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>. O valor retornado do <code class=\"docutils literal notranslate\"><span class=\"pre\">split_contents()</span></code> irá incluir as aspas para string literais como esta.</p></li>\n</ol>\n<p>Agora sua tag deve começar a parecer com isso:</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>You also have to change the renderer to retrieve the actual contents of the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">date_updated</span></code> property of the <code class=\"docutils literal notranslate\"><span class=\"pre\">blog_entry</span></code> object. This can be\naccomplished by using the <code class=\"docutils literal notranslate\"><span class=\"pre\">Variable()</span></code> class in <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template</span></code>.</p>\n<p>Para usar a class <code class=\"docutils literal notranslate\"><span class=\"pre\">Variable</span></code>, simplesmente instancie-a com o nome da variável a ser resolvida, e então <code class=\"docutils literal notranslate\"><span class=\"pre\">variable.resolve(context)</span></code>. Então por exemplo:</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>A resolução da variável irá lançar uma excessão <code class=\"docutils literal notranslate\"><span class=\"pre\">VariableDoesNotExist</span></code> se não conseguir resolver a string recebida no contexto corrente da página.</p>\n</section>\n<section id=\"setting-a-variable-in-the-context\">\n<h3>Definindo uma variável no contexto<a class=\"heading-anchor\" href=\"#setting-a-variable-in-the-context\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Os exemplos acima simplesmente retornam um valor. Geralmente, é mais flexível se suas tags de template definem variáveis ao invés de retornar valores. Desde modo, autores de templates podem reutilizar valores que suas tags de templates criam.</p>\n<p>Para definir uma variável no contexto, apenas use no objeto de contexto uma passagem de parâmetros por dicionário no método <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code>. Aqui uma versão atualizada de <code class=\"docutils literal notranslate\"><span class=\"pre\">CurrentTimeNode</span></code> que definie uma variável de template <code class=\"docutils literal notranslate\"><span class=\"pre\">current_time</span></code> ao invés de retornar uma saída:</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>Repare que <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> retorna uma string vazia. <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> deve sempre retornar uma string como saída. Se tudo que a tag de template faz é definir uma variável, <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> deve retornar uma string vazia.</p>\n<p>Aqui como você deveria usar esta nova versão da tag:</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\">Escopo da variável no context</p>\n<p>Qualquer variável definida no contexto somente estará disponível no mesmo “bloco” do template no qual ele foi definido. Este comportamento é intencional; ele fornece um escopo para as variáveis que então não conflitam com o contexto de outros blocos.</p>\n</aside>\n<p>But, there’s a problem with <code class=\"docutils literal notranslate\"><span class=\"pre\">CurrentTimeNode2</span></code>: The variable name\n<code class=\"docutils literal notranslate\"><span class=\"pre\">current_time</span></code> is hardcoded. This means you’ll need to make sure your\ntemplate doesn’t use <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">current_time</span> <span class=\"pre\">}}</span></code> anywhere else, because the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">current_time</span> <span class=\"pre\">%}</span></code> will blindly overwrite that variable’s value. A cleaner\nsolution is to make the template tag specify the name of the output variable,\nlike so:</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>Para fazer isso, será preciso refatorar a função de compilação e a classe de <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Node`, deste modo:</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>A diferença aqui é que <code class=\"docutils literal notranslate\"><span class=\"pre\">do_current_time()</span></code> pega a string de formato e o nome da variável passando ambos para <code class=\"docutils literal notranslate\"><span class=\"pre\">CurrenteNode3</span></code>.</p>\n<p>Finalmente, se você precisa ter somente uma sinatxe simples para sua tag de template personalizada que atualiza o contexto, considere usar o atalho <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>, o qual possibilita passar os resultados de uma tag para uma variável de template.</p>\n</section>\n<section id=\"parsing-until-another-block-tag\">\n<h3>“Parsing” até outra bloco de tag.<a class=\"heading-anchor\" href=\"#parsing-until-another-block-tag\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Tags de templates podem trabalhar em tandem. Por exemplo, a tag padrão <a class=\"reference internal\" href=\"/pt-br/6.0/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> esconde tudo até <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code>. Para criar uma tag de template coo esta, use <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.parse()</span></code> na sua função de compilação.</p>\n<p>Aqui como uma tag  <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">comment</span> <span class=\"pre\">%}</span></code> simplificada pode ser implmentada:</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\">Nota</p>\n<p>The actual implementation of <a class=\"reference internal\" href=\"/pt-br/6.0/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> is slightly\ndifferent in that it allows broken template tags to appear between\n<code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">comment</span> <span class=\"pre\">%}</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code>. It does so by calling\n<code class=\"docutils literal notranslate\"><span class=\"pre\">parser.skip_past('endcomment')</span></code> instead of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">parser.parse(('endcomment',))</span></code> followed by\n<code class=\"docutils literal notranslate\"><span class=\"pre\">parser.delete_first_token()</span></code>, thus avoiding the generation of a node\nlist.</p>\n</aside>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">parser.parse()</span></code> takes a tuple of names of block tags <em>to parse until</em>. It\nreturns an instance of <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.NodeList</span></code>, which is a list of\nall <code class=\"docutils literal notranslate\"><span class=\"pre\">Node</span></code> objects that the parser encountered <em>before</em> it encountered\nany of the tags named in the tuple.</p>\n<p>Em <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;nodelist</span> <span class=\"pre\">=</span> <span class=\"pre\">parser.parse(('endcomment',))&quot;</span></code> no exemplo acima, <code class=\"docutils literal notranslate\"><span class=\"pre\">nodelist</span></code> é uma lista de todos os nós entre o``{% comment %}`` e <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code>, sem contar os próprios <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">comment</span> <span class=\"pre\">%}</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code>.</p>\n<p>Depois que <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.parse()</span></code> é chamado, o analisaor sintático ainda não “consumiu” a tag <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code>, então o código precisa chamar explicitamente o <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> simplesmente retorna uma string vazia. Qualquer coisa entre <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">comment</span> <span class=\"pre\">%}</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code> é ignorado.</p>\n</section>\n<section id=\"parsing-until-another-block-tag-and-saving-contents\">\n<h3>Analisando sintaticamente até um outro bloco da tag, e armazenando seu conteúdo.<a class=\"heading-anchor\" href=\"#parsing-until-another-block-tag-and-saving-contents\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>No exemplo anterior, <code class=\"docutils literal notranslate\"><span class=\"pre\">do_comment()</span></code> descartou tudo entre``{% comment %}`` e <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endcomment</span> <span class=\"pre\">%}</span></code>. Ao invés de fazer isso, é possível fazer alguma coisa com o código que está dentro do bloco de tags.</p>\n<p>Por exemplo, aqui uma tag de template, <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">upper</span> <span class=\"pre\">%}</span></code>, que coloca todas as letras em maiúsculo de tudo entre ela e  <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endupper</span> <span class=\"pre\">%}</span></code>.</p>\n<p>Uso:</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>Como no exemplo anterior, usaremos <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.parse()</span></code>. Mas agora, passamos o <code class=\"docutils literal notranslate\"><span class=\"pre\">nodelist</span></code> resultante para o <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>O único conceito novo aqui é o <code class=\"docutils literal notranslate\"><span class=\"pre\">self.nodelist.render(context)</span></code> no <code class=\"docutils literal notranslate\"><span class=\"pre\">UpperNode.render()</span></code>.</p>\n<p>Para mais exemplos de renderização mais complexas, veja o código fonte da <a class=\"reference internal\" href=\"/pt-br/6.0/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> em <code class=\"docutils literal notranslate\"><span class=\"pre\">django/template/defaulttags.py</span></code> e <a class=\"reference internal\" href=\"/pt-br/6.0/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> em <code class=\"docutils literal notranslate\"><span class=\"pre\">django/template/smartif.py</span></code>.</p>\n</section>\n</section>","rootId":"how-to-create-custom-template-tags-and-filters","toc":[{"title":"Layout do código","anchor":"code-layout","children":[]},{"title":"Escrevendo filtros de templates personalizados","anchor":"writing-custom-template-filters","children":[{"title":"Registrando filtros customizados","anchor":"registering-custom-filters","children":[]},{"title":"Filtros de templates que recebem strings","anchor":"template-filters-that-expect-strings","children":[]},{"title":"Filtros e auto-escaping","anchor":"filters-and-auto-escaping","children":[]},{"title":"Filtros e fusos horários","anchor":"filters-and-time-zones","children":[]}]},{"title":"Escrevendo tags de templates personalizadas.","anchor":"writing-custom-template-tags","children":[{"title":"Tags simples","anchor":"simple-tags","children":[]},{"title":"Simple block tags","anchor":"simple-block-tags","children":[{"title":"A complete example","anchor":"a-complete-example","children":[]}]},{"title":"Tags de inclusão","anchor":"inclusion-tags","children":[]},{"title":"Tags personalizadas avançadas","anchor":"advanced-custom-template-tags","children":[]},{"title":"Um rápida visão geral","anchor":"a-quick-overview","children":[]},{"title":"Escrevendo a função de compilação","anchor":"writing-the-compilation-function","children":[]},{"title":"Escrevendo o “renderizador”","anchor":"writing-the-renderer","children":[]},{"title":"Considerações sobre auto-substituição","anchor":"auto-escaping-considerations","children":[]},{"title":"Considerações sobre segurança de “thread”","anchor":"thread-safety-considerations","children":[]},{"title":"Registrando a tag","anchor":"registering-the-tag","children":[]},{"title":"Passando variáveis de template para a tag.","anchor":"passing-template-variables-to-the-tag","children":[]},{"title":"Definindo uma variável no contexto","anchor":"setting-a-variable-in-the-context","children":[]},{"title":"“Parsing” até outra bloco de tag.","anchor":"parsing-until-another-block-tag","children":[]},{"title":"Analisando sintaticamente até um outro bloco da tag, e armazenando seu conteúdo.","anchor":"parsing-until-another-block-tag-and-saving-contents","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to guides","url":"/pt-br/6.0/howto/"}],"prev":{"docname":"howto/custom-template-backend","title":"Como implementar um backend de template personalizado","url":"/pt-br/6.0/howto/custom-template-backend/"},"next":{"docname":"howto/static-files/index","title":"How to manage static files (e.g. images, JavaScript, CSS)","url":"/pt-br/6.0/howto/static-files/"},"formats":{"html":"/pt-br/6.0/howto/custom-template-tags/","markdown":"/pt-br/6.0/howto/custom-template-tags.md","json":"/pt-br/6.0/howto/custom-template-tags.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/howto/custom-template-tags.txt","official":"https://docs.djangoproject.com/pt-br/6.0/howto/custom-template-tags/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}