..
.. META INFORMATION OF TRANSLATION
..
.. $TranslationStatus: Done, waiting for revision $
.. $OriginalRevision: 11332 $
.. $TranslationAuthors: Robson Mendonça $
..
.. INFO OF THIS FILE (DO NOT EDIT! UPDATED BY SUBVERSION)
..
.. $HeadURL$
.. $LastChangedRevision$
.. $LastChangedBy$
.. $LastChangedDate$
..
=================================
A linguagem de template do Django
=================================
.. admonition:: Sobre este documento
Este documento explana a sintaxe da linguagem do sistema de template do
Django. Se você estiver procurando por uma perspectiva mais técnica sobre
como ela funciona e como extendê-la, veja :doc:`/ref/templates/api`.
A linguagem de template do Django é projetada para atingir um balanço entre
poder e facilidade. Ela é projetada para ser confortável para aqueles que
acostumados a trabalhar com HTML. Se você tem qualquer exposição as outras
linguagens de template baseadas em texto, como o Smarty_ ou CheetahTemplate_,
você deverá sentir-se em casa com os templates do Django.
.. admonition:: Filosofia
Se você possui experiência prévea em programação, ou se você utilizou
linguagens como PHP que combina código de programação diretamente no HTML,
você deve ter em mente que o sistema de template de Django não é
simplesmente Python embutido no HTML. Isso ocorre por definição: o sistema
de template é usado para expressar apresentação, não lógica de programação.
O sistema de template do Django fornece tags que funcionam de forma similar
a algumas construções em programação -- uma tag :ttag:`if` para testes
boleanos, uma tag :ttag:`for` para laços, etc. -- mas estes não são
simplesmente executados como o código Python correspondente, e o sistema de
templates não executará arbitrariamente expressões Python. somente tags,
filtros e a sintaxe listada abaixo são suportados pelo padrão (embora você
possa adicionar :doc:`suas próprias extensões
à linguagem de template caso seja necessário).
.. _`A linguagem de template do Django: Para programadores Python`: ../templates_python/
.. _Smarty: http://smarty.php.net/
.. _CheetahTemplate: http://www.cheetahtemplate.org/
Templates
=========
.. highlightlang:: html+django
Um template é simplesmente um arquivo de texto. Ele pode gerar qualquer formato
baseado em texto (HTML, XML, CSV, etc.).
Um template contém **variáveis**, que são substituídas com valores quando o
template é processado, e **tags**, que controlam a lógica do template.
Abaixo tem um template mínimo que ilustra coisas básicas. Cada elemento será
explanado depois neste documento.::
{% extends "base_generic.html" %}
{% block title %}{{ section.title }}{% endblock %}
{% block content %}
{% endfor %}
{% endblock %}
.. admonition:: Filosofia
Porque usar um template baseado em texto ao invés de um baseado em XML (
como o TAL do ZOPE)? Nós queremos que a linguagem de template do Django seja
usável para mais do que somente templates XML/HTML. No Mundo Online, nós
o usamos para e-mails, JavaScript e CSV. Você pode usar a linguagem de
template para qualquer formato baseado em texto.
Oh, e uma coisa mais: Fazer humanos editarem XML é sadismo!
Variáveis
=========
Variáveis se parecem com isso: ``{{ variável }}``. Quando o motor de template
encontra uma variável, ele avalia aquela variável e a substitui pelo resultado.
Use um ponto (``.``) para acessar atributos de uma variável.
.. admonition:: Por trás das cenas
Tecnicamente, quando o sistema de template encontra um ponto, ele tenta
seguir a seguinte pesquisa, nesta ordem::
* Acesso a dicionário
* Acesso a atributo
* Chamada de método
* Acesso a indíce de lista
No exemplo acima, ``{{ section.title }}`` será substituído pelo atributo
``title`` do objeto ``section``.
Se você usa uma variável que não existe, o sistema de template inserirá o valor
da configuração ``TEMPLATE_STRING_IF_INVALID``, que é configurada como ``''``
(uma string vazia) por padrão.
Filtros
=======
Você pode modificar variáveis para mostrá-las usando **filtros**.
Filtros se parecem com isso: ``{{ name|lower }}``. Isso mostra o valor da
variável ``{{ name }}`` depois de ser filtrada através do filtro ``lower``, que
converte o texto para minúsculo. Use um pipe (``|``) para aplicar um filtro.
Filtros podem ser "aninhados." A saída do primeiro é aplicada no próximo.
``{{ text|escape|linebreaks }}`` é um idioma comum para escapar o conteúdo dos
textos, e então converter as quebras de linhas para tags ``
``.
Alguns filtros recebem argumento. Um argumento de filtro se parece com isso:
``{{ bio|truncatewords:30 }}``. Ele mostrará as primeiras 30 palavras da
variável ``bio``.
Argumentos de filtros que contém espaços devem ser posto entre aspas; por
exemplo, para unir uma lista com vírgulas e espaços você deverá usar
``{{ list|join:", " }}``.
O Django fornece por volta de 30 filtros nativos. Você pode ler tudo sobre eles
na :ref:`referência de filtros nativos `.
Para ter uma prova do que tem disponível, aqui tem alguns dos filtros de
template mais comuns:
:tfilter:`default`
Se uma variável é falsa ou vazia, use o dado default. Do contrário,
use o valor da variável
Por examplo::
{{ value|default:"nothing" }}
Se ``value`` não for fornecido ou estiver vazio, a linha acima mostrará
"``nothing``".
:tfilter:`length`
Retorna o comprimento do valor. Ele funciona para ambos strings e
listas;
Por examplo::
{{ value|length }}
Se ``value`` for ``['a', 'b', 'c', 'd']``, a saída será ``4``.
:tfilter:`striptags`
Mostra todas as tags [X]HTML. Por examplo::
{{ value|striptags }}
Se ``value`` for ``"Joel a
slug"``, a saída será ``"Joel is a slug"``.
Novamente, estes são somente alguns poucos exemplo; veja a :ref:`referência de
filtros nativos ` para uma lista completa.
Você também pode criar seus próprios filtros de templates; veja
:doc:`/howto/custom-template-tags`.
.. seealso::
Django's admin interface can include a complete reference of all template
tags and filters available for a given site. See
:doc:`/ref/contrib/admin/admindocs`.
Tags
====
Tags se parecem com isso: ``{% tag %}``. Tags snao mais complexas do que
variáveis: Algumas criam texto na saída, algumas controlam de fluxos executando
laços ou lógica, e algumas carregam informação externa para dentro do template
para ser usado por variáveis que surgirão.
Algumas tags necessitam de início e fim (i.e. ``{% tag %} ... conteúdo da tag
... {% endtag %}``).
O Django vem acompanhado umas duas dezenas de tags de templates embutidas. Você
pode ler tudo sobre elas na :ref:`referência de tags nativas
`. Para ter uma prova do que tem disponível, aqui
estão algumas das tags mais comuns:
:ttag:`for`
Executa um laço sobre itens de um array. Por exemplo, para mostrar uma
lista de atletas em ``athlete_list``::
{% for athlete in athlete_list %}
{{ athlete.name }}
{% endfor %}
:ttag:`if` and ``else``
Avalia se é uma variável, e se a variável é "true" os conteúdos do bloco
é mostrado::
{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% else %}
No athletes.
{% endif %}
<<<<<<< HEAD
No código acima, se ``athlete_list`` não for vazio, o número de atletas
será mostrado pela variável ``{{ athlete_list|lenght }}``.
You can also use filters and various operators in the ``if`` tag::
{% if athlete_list|length > 1 %}
Team: {% for athlete in athlete_list %} ... {% endfor %}
{% else %}
Athlete: {{ athlete_list.0.name }}
{% endif %}
:ttag:`block` and :ttag:`extends`
Configura `herança de template`_ (veja abaixo), um recurso poderoso de
cortar o "clichê" em template.
Novamente, acima tivemos somente uma seleção de toda lista; veja a
:ref:`referência de tags nativos ` para uma lista
completa.
Você também pode criar suas próprios tags de template; veja
:doc:`/howto/custom-template-tags`.
.. seealso::
Django's admin interface can include a complete reference of all template
tags and filters available for a given site. See
:doc:`/ref/contrib/admin/admindocs`.
Comentários
===========
Para comentar parte de uma linha num template, use a sintaxe de comentário:
``{# #}``.
Por exemplo, este template poderia renderizar como ``'hello'``::
{# greeting #}hello
Um comentário pode conter qualquer código de template, inválido ou não.
Por examplo::
{# {% if foo %}bar{% else %} #}
Esta sintaxe pode somente ser usada para comentário de uma linha (nenhuma linha
nova é permitida entre os delimitadores ``{#`` e ``#}``). Se você precisa
comentar uma porção de linhas de template, veja o tag :ttag:`coment`.
.. _template-inheritance:
Herança de template
===================
A parte mais poderosa -- e também a mais complexa -- do motor de template
do Django é a herança de template. Herança de template permite você contruir
um template "esqueleto" que contém todos os elementos comuns do site e define
**blocos** que seus filhos podem sobrescrever.
É mais fácil de entender herança de template começando com um exemplo::
{% block title %}My amazing site{% endblock %}
Este template, que nós chamaremos ``base.html``, define um esqueleto simples de
um documento HTML que você pode usar para uma simples página em duas colunas.
Neste exemplo, a tag ``{% block %}`` define três blocos que templates filhos
podem preenchê-los. Todas as tags ``block`` dizem ao motor de template que um
template filho podem sobrescrever partes de seu template.
Um template filho pode se parecer com isso::
{% extends "base.html" %}
{% block title %}My amazing blog{% endblock %}
{% block content %}
{% for entry in blog_entries %}
{{ entry.title }}
{{ entry.body }}
{% endfor %}
{% endblock %}
A tag ``{% extends %}`` é a chave aqui. Ela diz ao motor de template que este
template "estende" outro template. Quando o systema de template avalia este
template, primeiro ele localiza o pai -- neste case, "base.html".
Neste ponto, o motor de template notificará as três tags ``{% block %}`` no
``base.html`` e substituirá seus blocos com conteúdos do template filho.
Dependendo do valor do ``blog_entries``, a saída pode ficar assim::
My amazing blog
Percebe que como o template filho não define o bloco ``sidebar`` o valor do
template pai é usado em seu lugar. Conteúdos dentro de uma tag ``{% block %}``
num template pai sempre será usado como reserva.
Você pode usar tantos níveis de herança quantos precisar. Uma forma comum de
usar herança é seguir a abordagem de três níveis:
* Criar um template ``base.html`` que mantem a cara principal do site.
* Criar um template ``base_SECTIONNAME.html`` para cada "seção" de seu site.
Por exemplo, ``base_news.html``, ``base_sports.html``. Estes templates
todos estendem ``base.html`` e incluem estilos/design específicos da
seção.
* Criar templates individuais para cada tipo de página, como num artigo de
notícia ou entrada de blog. Estes templates estendem o template da seção
apropriada.
This approach maximizes code reuse and makes it easy to add items to shared
content areas, such as section-wide navigation.
Esta abordagem maximiza o reuso de código e torna mais fácil adicionar ítens
à áreas de conteúdo compartilhado, como num menu de navegação de uma seção.
Aqui tem algumas dicas para se trabalhar com herança:
* Se você usar ``{% extends %}`` num template, ele deve ser a primeira tag
deste template. A herança de template não funcionará, caso contrário.
* Quanto mais tags ``{% block %}`` em seu template base melhor. Lembre-se,
templates filho não podem definir blocos nos pais, então você pode
preencher uma quantidade razoável de blocos padrão, e só então definir o
que você precisará mais tarde. É melhor ter mais hooks do que poucos
hooks.
* Se você se surpreender duplicando conteúdo em vários templates, é bem
provável que isso signifique que você deva morar este conteúdo para um
``{% block %}`` no template pai.
* Se você precisa obter conteúdo de um bloco no template pai, a variável
``{{ block.super }}`` fará a mágica. Isso é útil se você deseja adicionar
conteúdos ao bloco pai ao invés de sobrescrevê-lo completamente. Dados
inseridos usando ``{{ block.super }}`` não serão automaticamente escapado
(veja a `próxima seção`_), uma vez que já será escapado, se necessário,
no template pai.
* Para facilitar a leitura extra, você pode opcionalmente dar um *nome* a
sua tag ``{% endblock %}``. Por exemplo::
{% block content %}
...
{% endblock content %}
Em templates grandes, esta técnica ajuda você ver que as tags
``{% block%}`` foram fechadas.
Finalmente, note que você nnao pode definir várias tags ``{% block %}`` com o
mesmo nome no mesmo template. Essa limitação existe porque uma tag de bloco
funciona em "ambas" direções. Isto é, uma tag de bloco não fornece apenas um
buraco para preencher -- ela também define o conteúdo que preenche o buraco no
*pai*. Se houver duas tags ``{% block %}`` iguais num template, o seu pai não
saberá para qual delas é o conteúdo.
.. _próxima seção: #automatic-html-escaping
.. _automatic-html-escaping:
Escape de HTML automático
=========================
.. versionadded:: 1.0
Quando um HTML é gerado a partir de templates, sempre há o risco de uma variável
incluir caracteres que afetam o HTML resultante. Por exemplo, considere este
fragmento de template::
Hello, {{ name }}.
A primeira vista, isso parece uma forma inofensiva de mostar o nome do usuário,
mas considere o que poderia acontecer se o usuário colocasse seu nome desta
forma::
Com este valor, o template poderia ser renderizado como::
Hello,
...o que significa que o navegador poderia mostrar uma caixa de alerta de
Javascript!
Semelhantemente, o que aconteceria se o nome tivesse um símbolo ``'<'``, tipo
isso?
username
Isso poderia resultar num template renderizado desta forma::
Hello, username
...que, por sua vez, poderia resultar em todo conteúdo restante da página Web
negritado!
Claramente, não se deve confiar cegamente em dados submetidos por usuários e
inseri-los diretamente na sua página Web, pois um usuário malicioso poderia usar
este tipo de brecha para fazer coisas potencialmente ruins. Este tipo de
exploração de sergurança é chamada de ataque `Cross Site Scripting`_ (XSS).
Para evitar este problema, você tem duas opções:
* Um, você pode assegurar-se de executar cada variável não confiável através
do filtro ``escape`` (documentado abaixo), que converte caracteres HTML
potencialmente prejudiciais para não prejudiciais. Essa foi uma solução
padrão no Django durante seus primeiros anos, mas o problema é que passa
o onus do problema a *você*, o desenvolvedor / autor de template, para
assegurar-se de escapar tudo. E é fácil esquecer de escapar dados.
* Dois, você pode obter vantagem do escape de HTML automático do Django. O
restante desta seção descreve como auto-escaping trabalha.
Por padrão no Django, todo template automaticamente escapa a saída de toda tag
de variável. Especialmente, estes cinco caracteres são escapados:
* ``<`` é convertido para ``<``
* ``>`` é convertido para ``>``
* ``'`` (aspas simples) é convertido para ``'``
* ``"`` (aspas duplas) é convertido para ``"``
* ``&`` é convertido para ``&``
Novamente, ressaltamos que esse comportamento é ativado por padrão. Se você
estiver usando o sistema de template do Django , você está protegido.
.. _Cross Site Scripting: http://en.wikipedia.org/wiki/Cross-site_scripting
Como desliga-lo
---------------
Se você não deseja que os dados sejam escapados automaticamente, ou um por site,
por nível de template ou por nível de variável, você pode desligá-lo de várias
formas.
Por que você gostaria de desligá-lo? Porque as vezes, as variáveis de templates
contém dados que você *pretende* renderizar como HTML puro, nestes casos você
nnao deseja que seus conteúdos sejam escapados. Por exemplo, você pode
armazenar um arquivo HTML em seu banco de dados e desejar mostrá-lo diretamente
dentro do template. Ou, você pode usar o sistema de template do Django para
produzir texto que *não* é HTML -- como uma mensagem de email, por exemplo.
Para valores individuais
~~~~~~~~~~~~~~~~~~~~~~~~
Para desabilitar o escape atual para uma variável individual, use o filtro
``safe``::
Isto será escapado: {{ data }}
Isto não será escapado: {{ data|safe }}
Pense *seguro* como uma abreviação de *seguro por um escape* ou *pode ser
seguramente interpretado como HTML*. Neste exemplo, se ``data`` contém
``''``, a saída será::
Isto será escapado: <b>
Isto não será escapado:
Para blocos de template
~~~~~~~~~~~~~~~~~~~~~~~
O controle do escape automático para um template, envolve o template (ou somente
uma seção particular do template) dentro da tag ``autoescape``, desta forma::
{% autoescape off %}
Hello {{ name }}
{% endautoescape %}
A tag ``autoescape`` recebe tanto ``on`` quanto ``off`` como seu argumento. Às
vezes, você pode querer forçar o auto escape quando ela poderia estar
desativada. Aqui tem um template de exemplo::
Auto-escaping is on by default. Hello {{ name }}
{% autoescape off %}
Isso não será escapado automaticamente: {{ data }}.
Isso não: {{ other_data }}
{% autoescape on %}
Auto escape aplicado novamente: {{ name }}
{% endautoescape %}
{% endautoescape %}
A tag auto escape passa seu efeito dentro dos tempaltes que extendem o atual
bem como templates inclusos via tag ``include``, exatamente como todas as tags
de bloco. Por exemplo::
# base.html
{% autoescape off %}
{% block title %}{% endblock %}
{% block content %}
{% endblock %}
{% endautoescape %}
# child.html
{% extends "base.html" %}
{% block title %}This & that{% endblock %}
{% block content %}{{ greeting }}{% endblock %}
Pelo auto escape estar desligado no template base, ele também estará desligado
no template filho, resultando no seguinte HTML renderizado quando a variável
``greeting`` contiver a string ``Hello!``::
This & that
Hello!
Notas
-----
Geralmente, autores de template não precisam se preocupar muito com auto escape.
Desenvolvedores do lado do Python (pessoas escrevendo views e filtros) precisam
pensar sobre os casos em que os dados não devem ser escapados, e marcar os dados
apropriadamente, só assim as Coisas Funcionam no template.
Se você estiver criando um template que pode ser usado em situações onde você
não tem certeza de que o auto-escape está ativo, então adicione o filtro
``escape`` em qualquer variável que precise ser escapada. Quando o auto escape
está ativo, não há perigo do filtro ``escape`` escapar duas vezes os dados -- o
filtro ``escape`` não afeta variáveis auto escapadas.
Literais de string e escape automático
--------------------------------------
Como mensionamos anteriormente, argumentos de filtros podem ser strings::
{{ data|default:"Este é um literal string." }}
Todo literal de string é inserido **sem** qualquer escape automático dentro do
template -- eles agem como se fossem todos passados através do filtro ``safe``.
A razão por trás disso é que os autores de templates estão no controle do
que vai dentro da string, então eles podem estar certos de que o texto está
corretamente escapado quando o template foi escrito.
Isso significa que você poderia escrever ::
{{ data|default:"3 < 2" }}
...ao invés de ::
{{ data|default:"3 < 2" }} <-- Bad! Don't do this.
Isso não afeta o que acontece com os dados vindos da variável em si. Os
conteúdos da variável ainda serão automaticamente escapados, se necessário,
pois eles estão além do controle do autor.
.. _loading-custom-template-libraries:
Bibliotecas de tags e filtros personalizados
============================================
Certas aplicaçõoes fornecem bibliotecas com tags e filtros personalizados. Para
acessá-los no seu template, use a tag ``{% load %}``::
{% load comments %}
{% comment_form for blogs.entries entry.id with is_public yes %}
Acima, a tag ``load`` carrega a biblioteca de tags ``comments``, que torna a tag
``comment_form`` disponível para uso. Consulte a área de documentação no seu
admin para encontrar a lista de bibliotecas personalizadas na sua instalação.
A tag ``{% load %}`` pode receber vários nomes de bibliotecas, separados por
espaços. Exemplo::
{% load comments i18n %}
See :doc:`/howto/custom-template-tags` for information on writing your own custom
template libraries.
Veja :doc:`/howto/custom-template-tags` para informações sobre como escrever suas
próprias bibliotecas de template.
Bibliotecas personalizadas e herança de template
------------------------------------------------
Quando você carrega uma biblioteca de tag ou filtro personalizado, as
tags/filtros estão disponíveis somente para o template atual -- não para
qualquer pai ou filho ao longo do caminho da herança de template.
Por exemplo, se um template ``foo.html`` tem ``{% load comments %}``, um
template filho (e.g., um que tenha ``{% extends "foo.html" %}``) *não* terá
acesso às tags e filtros comments. O template filho é responsável pelo seu
próprio ``{% load comments %}``.
Este é um recurso em prol da manutenção e sanidade.