Sintaxe da Camada de Templates e Passagem de Valores
Sintaxe Básica
Na camada de templates do Django, utiliza-se {% %} para lógica como carregamento de arquvios, loops for e condicionais if. Para variáveis, emprega-se {{ }}, permitindo transferir dados do backend para o frontend. O acesso a valores de variáveis pode ser feito diretamente via nome ou por meio de atribtuos usando ponto, com consulta em dicionários, atributos/métodos ou índices numéricos.
Preparação do Código
Crie uma view de classe no arquivo views.py da aplicação, herdando de View do Django. Defina métodos get e post para tratar requisições HTTP.
from django.views import View
from django.shortcuts import render, HttpResponse
class DemonstracaoView(View):
def get(self, request, *args, **kwargs):
# Lógica para requisição GET
return render(request, 'modelo.html', locals())
def post(self, request, *args, **kwargs):
# Lógica para requisição POST
return HttpResponse("Resposta da view POST")
Registre a view na rota raiz do projeto no arquivo urls.py principal.
from django.contrib import admin
from django.urls import path
from app.views import DemonstracaoView
urlpatterns = [
path('admin/', admin.site.urls),
path('', DemonstracaoView.as_view(), name='demo'),
]
Configure arquivos estáticos criando uma pasta static no projeto e adicionando-a em settings.py via STATICFILES_DIRS. No template, carregue arquivos estáticos com {% load static %}.
Passagem de Tipos de Dados
No método get da view, defina variáveis de diferentes tipos.
class DemonstracaoView(View):
def get(self, request, *args, **kwargs):
inteiro = 660
flutuante = 2.06
texto = 'avril lavigne'
lista = [11, 22, 'aa']
dicionario = {'escola': 'mit', 'nota': 1}
booleano = True
conjunto = {4, 5, 'f'}
tupla = (7, 8, 'i')
return render(request, 'modelo.html', locals())
No template, exiba essas variáveis.
<body>
<p>Inteiro: {{ inteiro }}</p>
<p>Flutuante: {{ flutuante }}</p>
<p>Texto: {{ texto }}</p>
<p>Texto com título: {{ texto.title }}</p>
<p>Lista: {{ lista }}</p>
<p>Elemento da lista: {{ lista.0 }}</p>
<p>Dicionário: {{ dicionario }}</p>
<p>Chaves do dicionário: {{ dicionario.keys }}</p>
<p>Valor do dicionário: {{ dicionario.escola }}</p>
<p>Booleano: {{ booleano }}</p>
<p>Conjunto: {{ conjunto }}</p>
<p>Tupla: {{ tupla }}</p>
</body>
Passagem de Funções e Classes
Funções sem parâmetros podem ser passadas, e o template renderiza seu valor de retorno. Para classes, passe o nome da classe ou objetos; a exibição pode ser customizada com métodos como __str__.
class DemonstracaoView(View):
def get(self, request, *args, **kwargs):
def calculo():
return 42
class Artista:
def cantar(self):
return "Música"
def __str__(self):
return "Instância de Artista"
artista1 = Artista()
return render(request, 'modelo.html', locals())
No template:
<body>
<p>Função: {{ calculo }}</p>
<p>Classe: {{ Artista }}</p>
<p>Objeto: {{ artista1 }}</p>
</body>
Filtros
Uso Básico
Filtros modificam a exibição de variáveis usando o operador |. Por exemplo, uma string HTML não é renderizada como código por padrão.
class DemonstracaoView(View):
def get(self, request, *args, **kwargs):
html_str = '<a href="">Link</a>'
return render(request, 'modelo.html', locals())
<body>
{{ html_str }}
</body>
Filtros Comuns
- length: Calcula o comprimento de strings ou listas:
{{ html_str|length }}. - default: Exibe um valor padrão se a variável for vazia ou falsa:
{{ valor|default:"N/A" }}. - filesizeformat: Formata tamanhos de arquivo legíveis:
{{ tamanho|filesizeformat }}. - date: Formata objetos datetime:
{{ tempo|date:"Y-m-d H:i:s" }}. - slice: Faz fatias em listas ou strings:
{{ texto|slice:"1:5" }}. - truncatechars: Trunca texto com reticências:
{{ descricao|truncatechars:10 }}. - cut: Remove caracteres específicos:
{{ frase|cut:" " }}. - join: Junta itens de iteráveis:
{{ lista|join:", " }}. - add: Soma valores numéricos:
{{ numero|add:5 }}. - safe: Converte strings para HTML seguro no frontend:
{{ html_str|safe }}.
No backend, use mark_safe para marcar strings como seguras.
from django.utils.safestring import mark_safe
class DemonstracaoView(View):
def get(self, request, *args, **kwargs):
html_seguro = mark_safe('<b>Texto negrito</b>')
return render(request, 'modelo.html', locals())
Tags
Loops e Condicionais
Use {% for %} para iterações e {% if %} para lógica condicional.
{% for item in itens %}
{{ item }}
{% empty %}
Lista vazia.
{% endfor %}
{% if condicao1 %}
Conteúdo 1
{% elif condicao2 %}
Conteúdo 2
{% else %}
Conteúdo padrão
{% endif %}
Variáveis como forloop.counter fornecem controle sobre iterações.
Componentes Personalizados
Criando Filtros e Tags
Na pasta templatetags da aplicação, crie um módulo Python. Registre filtros e tags personalizados.
from django import template
registro = template.Library()
@registro.filter
def filtro_personalizado(valor, arg):
return valor + arg
@registro.simple_tag(name='nova_tag')
def tag_simples(a, b):
return a * b
@registro.inclusion_tag('parcial.html')
def tag_inclusao(dados):
return {'itens': dados}
No template, carregue o módulo e use os componentes.
{% load meus_tags %}
{{ variavel|filtro_personalizado:10 }}
{% nova_tag 2 3 %}
{% tag_inclusao itens %}
Herança de Templates
Implementação
Use {% extends %} para herdar de templates base e {% block %} para definir seções substituíveis.
{# template_base.html #}
<html>
<head>{% block css %}{% endblock %}</head>
<body>
{% block conteudo %}{% endblock %}
{% block js %}{% endblock %}
</body>
</html>
{# template_filho.html #}
{% extends 'template_base.html' %}
{% block conteudo %}
<p>Conteúdo específico.</p>
{% endblock %}
Utilize {{ block.super }} para manter o conteúdo do template pai em um bloco.