Templates Aninhados. Filtro include no Django
O filtro include permite incorporar um template dentro de outro, tornando a estrutura de templates mais modular e reutilizável. O nome do template a ser incluído é especificado como parâmetro do filtro:
{% include "nome_do_template" %}Por exemplo, considere dois templates em um projeto Django: index.html e banner.html.
PROGRAMICIO
hello/
|-- migrations/
|-- templates/
|-- banner.html
|-- index.html
|-- __init__.py
|-- admin.py
|-- apps.py
|-- models.py
|-- tests.py
|-- views.py
programicio/
|-- __init__.py
|-- asgi.py
|-- settings.py
|-- urls.py
|-- wsgi.pyNo arquivo banner.html, um código simples pode ser definido assim:
<div>Guia de Django em www.programicio.com</div>No arquivo index.html, o template banner.html é incluído dessa forma:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Django em www.programicio.com</title>
</head>
<body>
<h2>Página Inicial</h2>
{% include "banner.html" %}
</body>
</html>Quando o navegador acessa index.html, o conteúdo de banner.html é renderizado no local definido pelo filtro include.

Vale ressaltar que, ao invés de especificar diretamente o caminho do template como uma string fixa, é possível utilizar uma variável para determinar qual template será incluído:
{% include template_name %}Nesse cenário, espera-se que template_name contenha o caminho do template desejado. Isso torna a inclusão mais flexível, especialmente em situações onde o template é escolhido dinamicamente.
Enviando Dados para Templates Aninhados
Templates aninhados podem receber dados adicionais. Modificamos o template banner.html para o seguinte:
<div>Guia de {{ tutorial }} em {{ site }}</div>O código de index.html pode ser ajustado para incluir essas variáveis:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Django em www.programicio.com</title>
</head>
<body>
<h2>Página Inicial</h2>
{% include "banner.html" with tutorial="Python" site="www.programicio.com" %}
</body>
</html>As variáveis tutorial e site são definidas após o operador with. Isso permite personalizar o conteúdo do template incluído com base no contexto do template pai.

Herança de Dados
Templates aninhados herdam automaticamente variáveis e dados fornecidos pelo template pai, a menos que explicitamente configurado de outra forma. Por exemplo, considere o template banner.html:
<div>Guia de {{ tutorial }} em {{ site }}</div>No arquivo views.py, é possível definir uma função de renderização que fornece a variável site para o template index.html:
from django.shortcuts import render
def index(request):
return render(request, "index.html", context={"site": "www.programicio.com"})Com essa configuração, o código de index.html pode ser escrito assim:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Django em www.programicio.com</title>
</head>
<body>
<h2>Página Inicial</h2>
{% include "banner.html" with tutorial="Python" %}
</body>
</html>No template banner.html, a variável site estará automaticamente disponível porque foi enviada para o template pai index.html.
Controle sobre a Herança de Dados
Se a herança automática de variáveis do template pai para o template aninhado não for desejada, o operador only pode ser utilizado:
{% include "banner.html" with tutorial="Python" only %}Nesse caso, o template banner.html não terá acesso às variáveis do template pai, como site. Apenas as variáveis explicitamente fornecidas com o operador with estarão disponíveis no template aninhado.
Documentação oficial: