- Sintaxe dos Templates
Os templates do Django utilizam duas formas de marcação:
{{ variavel }}– exibe o valor de uma variável.{% comando %}– executa lógica de controle (loops, condições, etc.).
- Passagem de Valores para o Template
No Django, é possível passar para o template qualquer tipo de dado Python:
- Tipos básicos (int, float, string, bool, list, dict, tuple, set)
- Funções e classes – são automaticamente chmaadas (funções executadas, classes instanciadas)
- Objetos – são acessados diretamente com o operador ponto
Existem duas formas de passar dados no views.py:
# 1. Nomeando explicitamente cada variável
return render(request, 'pagina.html', {'nome': nome, 'idade': idade})
# 2. Usando locals() – passa todas as variáveis do escopo local
return render(request, 'pagina.html', locals())
No template, os dados são acessados com {{ nome_da_variavel }}.
- Acesso a Dados (Operador Ponto)
O Django utiliza exclusivamente o operador ponto (.) para acessar atributos, itens de dicionário, índices de lista e métodos de objetos.
<p>{{ lista.2 }}</p> <!-- índice da lista -->
<p>{{ dicionario.usuario }}</p> <!-- chave do dicionário -->
<p>{{ objeto.atributo }}</p> <!-- atributo do objeto -->
<p>{{ dicionario.hobby.1.nome.1 }}</p> <!-- aninhamento -->
- Filtros
Os filtros são aplicados com o caractere pipe (|). O valor à esquerda do pipe é o primeiro argumento do filtro; o valor à direita (após :) é o segundo argumento.
| Filtro | Exemplo | Descrição |
|---|---|---|
length |
{{ texto|length }} |
Retorna o tamanho. |
add |
{{ numero|add:10 }} |
Soma ou concatena. |
default |
{{ variavel|default:'Valor Padrão' }} |
Exibe valor se a variável for False/None/vazia. |
truncatechars |
{{ texto|truncatechars:10 }} |
Trunca o texto até o número de caracteres (inclui reticências). |
truncatewords |
{{ texto|truncatewords:5 }} |
Trunca até o número de palavras (reticências não contam). |
filesizeformat |
{{ tamanho|filesizeformat }} |
Formata bytes em unidade legível. |
slice |
{{ texto|slice:'0:5' }} |
Fatia a string ou lista. |
date |
{{ data|date:'Y/m/d' }} |
Formata data. |
safe |
{{ html|safe }} |
Marca o conteúdo como seguro (não escapa HTML). |
Também é possível marcar uma string como segura no back end com mark_safe:
from django.utils.safestring import mark_safe
html_seguro = mark_safe('<h1>Título Seguro</h1>')
- Tags (Lógica)
Laço for e condicional if
<ul>
{% for item in lista %}
{% if forloop.first %}
<li class="primeiro">{{ item }} (primeiro)</li>
{% elif forloop.last %}
<li class="ultimo">{{ item }} (último)</li>
{% else %}
<li>{{ item }}</li>
{% endif %}
{% empty %}
<li>Nenhum item encontrado</li>
{% endfor %}
</ul>
O objeto forloop fornece propriedades úteis:
forloop.counter– índice iniciando em 1forloop.first–Truese for a primeira iteraçãoforloop.last–Truese for a última iteração
Alias com with
Para simplificar o acesso a valores aninhados:
{% with dicionario.hobby.1.nome.1 as apelido %}
<p>{{ apelido }}</p>
{% endwith %}
- Filtros e Tags Personalizados
Para criar filtros ou tags próprios:
- Crie uma pasta chamada
templatetagsdentro do aplicativo. - Crie um arquivo Python (ex.:
meus_filtros.py). - Adicione o seguinte código:
from django.template import Library
register = Library()
# Filtro personalizado – aceita até dois argumentos
@register.filter(name='soma')
def soma(a, b):
return a + b
# Tag simples – aceita vários argumentos
@register.simple_tag(name='mensagem')
def mensagem(a, b, c, d):
return f'{a} + {b} + {c} + {d}'
# Inclusion tag – renderiza um template parcial
@register.inclusion_tag('parcial.html', name='minha_lista')
def gerar_lista(n):
itens = list(range(n))
return {'itens': itens}
No template, use {% load meus_filtros %} e então:
<p>{{ 10|soma:90 }}</p>
<p>{% mensagem 1 2 3 'Hello' %}</p>
<div>{% minha_lista 5 %}</div>
Observação: Filtros personalizados podem ser usados em condições if; tags simples não.
- Herança e Inclusão de Templates
Herança
Para reutilizar uma estrutura comum, defina blocos no template base:
<html>
<head>
{% block css %}{% endblock %}
</head>
<body>
{% block conteudo %}
<p>Conteúdo padrão</p>
{% endblock %}
{% block js %}{% endblock %}
</body>
</html>
No template filho, use {% extends 'base.html' %} e sobrescreva os blocos:
{% extends 'base.html' %}
{% block conteudo %}
<p>Meu conteúdo personalizado</p>
{{ block.super }} <!-- inclui o conteúdo do bloco pai -->
{% endblock %}
Inclusão
Para incluir partes de templates reutilizáveis (componentes):
<div class="sidebar">
{% include 'barra_lateral.html' %}
</div>
O arquivo incluído geralmente contém apenas um fragmento HTML, sem estrutura copmleta.