Templates Django

Templates

Os templates no Django são arquivos que permitem a separação da lógica do servidor (back-end) e a apresentação da interface ao usuário (front-end). Eles são usados para gerar páginas HTML dinâmicas (através de DTL) que podem incluir variáveis, laços, condições e até mesmo trechos de código reutilizáveis (como blocos).

Esse é um exemplo de uma boa estutura de templates:

A razão pela qual é uma boa pratica colocar o mesmo nome da pasta do aplicativo dentro da pasta template, é porque o django pode direferenciar os mesmo nomes de arquivos ( como index.html) dos outros aplicativo, ja que o django trata todas as pastas templates incluídas no settings.py juntas.

As letras maiúsculas denota constantes ou configurações globais. No caso do Django, as variáveis em letras maiúsculas são parte das configurações essenciais do projeto e devem ser definidas no arquivo settings.py.

INSTALLED_APPS: Ao instalar o seu aplicativo em settings não precisará se preocupar em apontar um caminho para o template (em DIRS), pois o django monitorará a pasta templates automaticamente. Após instalado Django reconhece o aplicativo como parte do projeto, permitindo o uso de suas views, modelos, templates e outras funcionalidades.

O nome do seu aplicativo poderá ser encontrado em apps.py (do app que você deseja adicionar).

| Configurando Templates

Configure o template no arquivo settings do aplicativo principal do projeto (na lista DIRS), para que quando a pagina for renderizada o Django possa encontra-lo.

O Django segue a ordem do dicionário, primeiro, verifica os diretórios definidos em DIRS. em seguida, se'APP_DIRS': True, informa ao django que ele procure pelo diretorio templates/ dentro das pastas de cada aplicativo instalado (INSTALLED_APPS).

Duas formas de instalar o projeto.

Forma Quando usar
'projeto' Simples, funciona para quase tudo
'projeto.apps.ProjetoConfig' Quando quer personalizar o comportamento do app (por exemplo, usar signals, configurações extras, nome personalizado, etc.)

BASE_DIR é variável (configurada no settings.py) com o caminho da pasta principal do projeto, que pode ser usada para construção de caminhos para diretórios.

settings_DIRS.py
TEMPLATES = [
    {
        'BACKEND': pass,
        'DIRS': [
            # Caminhos para as pastas templates de meus aplicativos
            BASE_DIR / "meu_app" / "templates" / "meu_app"
        ],
        # Procura templates nos aplicativos instalados
        'APP_DIRS': True,
        'OPTIONS': {
            pass
        },
    },
]

Uso o pass, para ignorar as linhas que ja vem padrão

settings_INSTALLED_APPS.py
INSTALLED_APPS = [
        # Instala o aplicativo no Django
        'meu_app',
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]

Não esqueça de que usando esse modelo, toda vez que for usar um template, precisa identificar de qual aplicativo (meu_app/index.html)

| Exemplo render to string

render_to_string é uma função do Django que renderiza um template para uma string em vez de retornar uma resposta HTTP diretamente. Ele é útil quando você precisa do conteúdo renderizado de um template como texto bruto.

views_html_to_string.py
from django.template.loader import render_to_string
from django.http import HttpResponse

def index(request):

    # Leu a página html e transformou em uma string
    html_conteudo = render_to_string('index.html')

    # Retorna a string renderizada como resposta
    return HttpResponse(html_conteudo)

Caso estivesse utilizando INSTALLED_APPS o caminho para encontrar o template seria ('meu_app/index.html')

index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>ESTA É A PAGINA PRINCIPAL DE NOTICIAS</p>
</body>
</html>

| Função Render

O render é uma função do Django usada para simplificar o processo de gerar e retornar uma resposta HTTP ao cliente com base em um template. Ele combina o carregamento de um template, a inserção de um contexto (dados dinâmicos) e a criação de um objeto HttpResponse.

Sintaxe:

django.shortcuts.render(request, template_name, context=None, content_type=None, status=None, using=None)

  • request: O objeto de solicitação HTTP, necessário para o processamento.
  • template_name: O caminho para o template HTML que será renderizado.
  • context (opcional): Um dicionário de dados que será injetado no template, tornando-o dinâmico.
  • content_type (opcional): Define o tipo de conteúdo da resposta. O padrão é text/html.
  • status (opcional): Código de status HTTP, como 200 (padrão), 404, etc.
  • using (opcional): Define um nome de carregador de template específico, caso necessário.
views_render.py
from django.shortcuts import render

def index(request):
    return render(request, "meu_app/index.html")
index_render.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>ESTA É A PAGINA PRINCIPAL DE NOTICIAS</p>
    <p>{{teste}}</p>
</body>
</html>

Herança de Templates

Em Django é uma maneira de criar uma estrutura de layout reutilizável para várias páginas do seu site, evitando a duplicação de código. Define-se um template base (geralmente chamado base.html) que contém a estrutura comum do site e outras páginas herdam essa estrutura e podem adicionar ou substituir conteúdo em áreas específicas do template base.

| Herança Templates

Uma boa prática é deixar uma pasta templates dentro do diretório do projeto (do lado de fora) para ser ultilizada por vários app.

base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <title>{% block title %}Meu Site{% endblock %}</title>
</head>
<body>
    <header>
        <h1>Bem-vindo ao Meu Site</h1>
    </header>

    <main>
        {% block content %}{% endblock %}
    </main>

    <footer>
        <p>Todos os direitos reservados.</p>
    </footer>
</body>
</html>
index.html
{% extends "base.html" %}

{% block title %}Página Inicial{% endblock %}

{% block content %}
    <p>Este é o conteúdo da página inicial.</p>
{% endblock %}
settings_herança.py
TEMPLATES = [
    {
        'BACKEND': pass,
        'DIRS': [
            # Caminho da pasta templates na raiz do projeto
            BASE_DIR / "templates"
        ],
        pass
    },
]

Se o seu aplicativo estiver buscando os templates instalados (INSTALLED_APPS), ele não visualisará a pasta templates do diretorio raiz, por isso é necessário defini-la em DIRS 


Snippets

São pedaços pequenos e reutilizáveis de código, geralmente componentes de interface ou blocos de HTML, que podem ser usados em vários lugares dentro dos templates, como por exemplo um navbar, um rodapé, cabeçalho e etc.

Crie uma pasta partials (ou includes se preferir) dentro da pasta template de seu aplicativo para salvar seus snippets.

| Exemplo Snippets

É possível passar valores específicos ou renomear variáveis ao incluir o snippet usando with. Nesse caso abaixo, a variável usuário terá o valor "Diogo" (no header.html que é o snippet) em vez de usar o valor de usuario do template index ( passado pela views.py que é: Paulo)

index.html
{% include "meu_app/partials/header.html" with usuario="Diogo" %}
<p>Usuario vindo da view: {{usuario}}</p>
header.html
<header>
    <div class="logo">
        <h1>Noticias Agora - {{usuario}}</h1>
    </div>
    <nav>
        <ul class="nav-links">
            <li><a href="/">Home</a></li>
            <li><a href="/politica">Política</a></li>
            <li><a href="/esportes">Esportes</a></li>
            <li><a href="/tecnologia">Tecnologia</a></li>
            <li><a href="/contato">Contato</a></li>
        </ul>
    </nav>
</header>
views_snippets.py
def index(request):
    return render(request, "meu_app/index.html",{
        'teste':'AQUI TO NO RENDER',
        'usuario': 'Paulo',
    })

Erro 404

Quando você configura DEBUG = False no seu arquivo settings.py, o Django entende que a aplicação está em produção. Nesse modo, o Django não exibirá páginas de erro detalhadas para o usuário final (que poderiam expor informações sensíveis). Em vez disso, ao configurar DEBUG = False, o Django procurará um arquivo chamado 404.html no diretório de templates sempre que ocorrer um erro 404.

Quando você desativa o modo de depuração (DEBUG = False), é obrigatório configurar a lista de domínios ou endereços IP permitidos no parâmetro ALLOWED_HOSTS do arquivo settings.py. Essa configuração é uma medida de segurança para garantir que sua aplicação só aceite solicitações de hosts autorizados.

Configurar HOST e DEBUG

ALLOWED_HOSTS é uma lista de strings, encontrada no arquivo settings.py da aplicação principal, que define os domínios e/ou endereços IP que podem acessar a sua aplicação Django. No ambiente de produção, defina os domínios reais do seu site.

settings_debug_host.py
DEBUG = FALSE

# Configuração de Ambiente de Produção
ALLOWED_HOSTS = ['meusite.com', 'www.meusite.com']

# Para permissão de testes locais
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

# Liberar todos os acessos
ALLOWED_HOSTS = ['*']
404.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Página não encontrada</title>
</head>
<body>
    <h1>Erro 404</h1>
    <p>Desculpe, a página que você está procurando não foi encontrada.</p>
    <a href="/noticias/">Voltar para a página inicial</a>
</body>
</html>

Http404: É uma exceção fornecida pelo Django para indicar que uma página ou recurso não foi encontrado. Quando você levanta essa exceção manualmente no seu código (raise Http404()), o Django responde com um erro 404 automaticamente.

http404_excecao
from django.http import Http404

def minha_view(request, id):
    try:
        objeto = MeuModelo.objects.get(pk=id)
    except MeuModelo.DoesNotExist:
        raise Http404("Objeto não encontrado")
    return render(request, "detalhe.html", {"objeto": objeto})

Se o objeto com o id fornecido não for encontrado, a exceção Http404 será levantada. e com DEBUG = False e a página 404.html configurada, o Django exibirá a página personalizada para o usuário.