Camada de Templates no Django: Sintaxe, Filtros, Tags e Herança

  1. 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.).
  1. 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 }}.

  1. 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 -->

  1. 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>')

  1. 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 1
  • forloop.firstTrue se for a primeira iteração
  • forloop.lastTrue se 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 %}

  1. Filtros e Tags Personalizados

Para criar filtros ou tags próprios:

  1. Crie uma pasta chamada templatetags dentro do aplicativo.
  2. Crie um arquivo Python (ex.: meus_filtros.py).
  3. 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.

  1. 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.

Tags: Django templates sintaxe de template filtros Django tags Django

Publicado em 6-8 05:37 por Thomas