Se você está começando com Django, uma coisa fica clara rápido: templates crescem.
Header, footer, menu, mensagens, cards… tudo se repete.
No começo, copiar e colar parece normal.
Depois de alguns arquivos, vira um problema.
É exatamente aqui que entra o {% include %}.
Neste artigo, vou te explicar de forma simples e prática o que é {% include %}, quando usar e como evitar erros comuns.
Tudo com exemplos reais de projeto.
O que é {% include %} no Django
O {% include %} é uma tag do Django Template Language (DTL) usada para reutilizar trechos de HTML em vários templates.
Na prática, ele:
-
Insere um template dentro de outro
-
No ponto exato onde a tag aparece
-
Sem duplicar código
Pense assim:
É como um “copiar e colar” inteligente, organizado e profissional.
Quando você altera o arquivo incluído, todos os lugares que usam o include são atualizados.
Por que usar {% include %} desde o começo

Em projetos reais, não usar include vira dívida técnica.
Usar {% include %} ajuda a:
-
Evitar duplicação de código
-
Manter templates menores e legíveis
-
Separar responsabilidades visuais
-
Facilitar manutenção
-
Escalar o projeto com organização
Na prática, o erro acontece quando você ignora isso no início.
Depois, dá muito mais trabalho refatorar.
Quer se aprofundar no assunto e ter um material completo para consulta?
Faça o download do PDF gratuito e tenha acesso a um guia prático e direto ao ponto.
Baixar PDF agora
Estrutura de templates recomendada
Uma estrutura simples e profissional costuma seguir este padrão:
templates/
├── base.html
├── pages/
│ ├── home.html
│ └── post_detail.html
└── includes/
├── header.html
├── footer.html
├── navbar.html
├── messages.html
└── pagination.html
Regra de ouro
Tudo que é reutilizável vai para templates/includes/.
Header aparece em todas as páginas? Include.
Footer também? Include.
Card de post se repete? Include.
Exemplo básico de {% include %}
Vamos ao exemplo mais simples possível.
1. Template incluído
templates/includes/header.html
<header>
<h1>Meu Blog Profissional</h1>
</header>
2. Template principal
templates/base.html
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>{% block title %}Blog{% endblock %}</title>
</head>
<body>
{% include "includes/header.html" %}
<main>
{% block content %}{% endblock %}
</main>
</body>
</html>
O conteúdo de header.html será renderizado exatamente onde o include está.
Simples, limpo e organizado.
Como o contexto funciona no {% include %}

Aqui está um detalhe importante que muita gente não entende no começo.
O template incluído herda automaticamente o contexto do template atual.
Exemplo na view
def home(request):
return render(request, "pages/home.html", {
"user_name": "Tiago"
})
Template incluído
templates/includes/header.html
<header>
<p>Olá, {{ user_name }}</p>
</header>
Isso funciona sem nenhuma configuração extra.
Na prática, o erro acontece quando o dev acha que precisa “reenviar” variáveis.
Na maioria dos casos, não precisa.
Passando variáveis manualmente para o include
Quando você quer criar componentes reutilizáveis, passar variáveis é comum.
Você faz isso com with.
Exemplo
{% include "includes/card.html" with title="Post Destaque" %}
Template incluído
templates/includes/card.html
<div class="card">
<h2>{{ title }}</h2>
</div>
Esse padrão é muito usado para:
-
Cards
-
Alertas
-
Blocos de conteúdo
-
Componentes visuais reutilizáveis
Na prática, testei e funcionou assim em projetos reais.
Isolando o contexto com only (uso avançado)
Em projetos maiores, o contexto pode ficar confuso.
Para evitar conflitos, você pode usar only.
{% include "includes/card.html" with title="Post" only %}
O template incluído só enxerga as variáveis passadas explicitamente.
Isso é útil quando:
-
Existem variáveis com o mesmo nome
-
Você quer mais previsibilidade
-
O projeto começa a crescer
Não é obrigatório no início, mas é bom conhecer.
{% include %} vs {% extends %}
Essa comparação é obrigatória.
{% include %} |
{% extends %} |
|---|---|
| Reutiliza pedaços | Herda layout inteiro |
| Componentes | Estrutura base |
| Pode aparecer várias vezes | Usado uma vez |
| Header, footer, cards | base.html |
Nunca confunda os dois.
-
extendsdefine a estrutura da página -
includemonta os componentes dentro dela
Erros comuns ao usar {% include %}
1. Colocar lógica pesada no template
Exemplo ruim:
{% if user.is_authenticated and user.profile.is_admin %}
Boa prática:
A lógica deve vir da view, não do template.
O template só exibe o que já foi decidido.
2. Includes gigantes
Se o include vira quase uma página inteira, algo está errado.
Nesse caso, você deveria:
-
Usar
{% extends %} -
Ou quebrar em mais componentes
Include é para pedaços, não para páginas completas.
Exemplo real: mensagens do Django
Esse padrão aparece em praticamente todo projeto profissional.
Template incluído
templates/includes/messages.html
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li class="{{ message.tags }}">
{{ message }}
</li>
{% endfor %}
</ul>
{% endif %}
Uso no base.html
{% include "includes/messages.html" %}
Dessa forma, qualquer página pode exibir mensagens sem repetir código.
Na prática, esse foi o comportamento que observei em projetos reais.
Boas práticas profissionais (resumo final)

Para fechar, guarde isso:
-
Crie uma pasta
templates/includes/ -
Use
{% include %}apenas para componentes reutilizáveis -
Prefira passar variáveis com
with -
Evite lógica complexa em templates
-
Combine
{% include %}com{% extends %} -
Use nomes claros como
navbar.html,footer.html,messages.html
Se você aprender isso cedo, seus templates vão ficar mais limpos, profissionais e fáceis de manter.