Criação e Uso de Templates no Django
Os templates em Django são responsáveis por definir a apresentação de uma aplicação, permitindo incorporar dados diretamente no código HTML por meio de um sistema de sintaxe especializado. Este artigo aborda como configurar e utilizar templates em um projeto Django.
Imagine um projeto chamado programicio que contém uma única aplicação chamada hello
. O arquivo settings.py
do projeto gerencia as configurações de templates por meio da variável TEMPLATES
.
A variável TEMPLATES
define como os templates serão processados e onde eles serão encontrados. Por padrão, apresenta a seguinte estrutura:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
Configurações da variável TEMPLATES
:
BACKEND
: Especifica a template engine utilizada. O valor padrão édjango.template.backends.django.DjangoTemplates
, que é nativo do Django.DIRS
: Lista os diretórios onde o Django procurará por arquivos de template. Inicialmente, este valor é um array vazio.APP_DIRS
: Define se os templates serão procurados dentro da pastatemplates
de cada aplicativo. O valor padrão éTrue
.OPTIONS
: Contém configurações adicionais, como os processadores de contexto, que facilitam o acesso a dados úteis dentro dos templates.
Essa configuração padrão já está preparada para encontrar templates dentro das pastas templates
de qualquer aplicação. Por exemplo, criar uma pasta templates
dentro da aplicação hello
e adicionar um arquivo chamado index.html
faz com que ele seja automaticamente localizado.
A estrutura básica do aplicação hello
pode ser organizada da seguinte forma:
hello/ |-- migrations/ |-- templates/ | |-- index.html |-- __init__.py |-- admin.py |-- apps.py |-- models.py |-- tests.py |-- views.py
No arquivo index.html
, é possível definir um HTML básico como este:
<!DOCTYPE html>
<html>
<head>
<title>Django no www.programicio.com</title>
<meta charset="utf-8" />
</head>
<body>
<h2>Hello www.programicio.com</h2>
</body>
</html>
No arquivo views.py
, as funções de visualização (views) são configuradas para renderizar templates e retorná-los como resposta. Por exemplo:
from django.shortcuts import render
def index(request):
return render(request, "index.html")
A função render
recebe o objeto de requisição (request
) e o caminho relativo do template, considerando a pasta templates
.
No arquivo urls.py
, a função index
é vinculada a uma rota:
from django.urls import path
from hello import views
urlpatterns = [
path("", views.index),
]
Após essas configurações, ao acessar a URL raiz da aplicação, o template index.html
será exibido no navegador.
Trabalhando com Vários Templates
Para adicionar novos templates, como about.html
e contact.html
, basta criá-los na pasta templates
:
hello/ |-- migrations/ |-- templates/ | |-- index.html | |-- about.html | |-- contact.html |-- __init__.py |-- admin.py |-- apps.py |-- models.py |-- tests.py |-- views.py
Em views.py
, novas funções de visualização são definidas para renderizar os novos templates:
from django.shortcuts import render
def index(request):
return render(request, "index.html")
def about(request):
return render(request, "about.html")
def contact(request):
return render(request, "contact.html")
No arquivo urls.py
, as novas visualizações são associadas às rotas:
urlpatterns = [
path("", views.index),
path("about/", views.about),
path("contact/", views.contact),
]
Agora, as páginas about.html
e contact.html
estarão disponíveis nas URLs /about/
e /contact/
.
Usando TemplateResponse
Além da função render
, é possível utilizar a classe TemplateResponse
para gerar respostas baseadas em templates. A funcionalidade é equivalente, mas TemplateResponse
pode ser útil em situações onde a resposta precise ser modificada antes de ser enviada ao cliente:
from django.template.response import TemplateResponse
def index(request):
return TemplateResponse(request, "index.html")
O resultado será o mesmo de render
, mas com maior controle sobre o processo de resposta.
Documentação oficial: