Rotas Aninhadas e a Função include no Django
A função include()
possibilita a definição de rotas aninhadas ou sub-rotas associadas a uma rota principal. Essa funcionalidade é implementada ao incluir um conjunto de rotas dentro de uma rota principal, o que permite agrupar rotas relacionadas a um contexto específico.
Considere o seguinte exemplo, onde no arquivo views.py
são definidas as seguintes funções:
from django.http import HttpResponse
def index(request):
return HttpResponse("Página principal")
def products(request):
return HttpResponse("Lista de produtos")
def new(request):
return HttpResponse("Novos produtos")
def top(request):
return HttpResponse("Produtos mais populares")
As últimas três funções são diretamente relacionadas ao domínio de produtos.
No arquivo urls.py
, é possível organizar as rotas relacionadas aos produtos da seguinte forma:
from django.urls import path, include
from hello import views
product_patterns = [
path("", views.products),
path("new", views.new),
path("top", views.top),
]
urlpatterns = [
path("", views.index),
path("products/", include(product_patterns)),
]
Aqui, a variável product_patterns
encapsula rotas específicas para o domínio de produtos. Este conjunto de rotas é passado para a função include()
para ser associado à rota principal "products/"
:
path("products/", include(product_patterns)),
Isso possibilita que as rotas aninhadas sejam combinadas com o caminho definido na rota principal. Por exemplo, a URL http://127.0.0.1:8000/products/top
será processada pela função top
.
Essa organização evita redundâncias e facilita a manutenção, agrupando rotas que compartilham um contexto comum.
Passando Parâmetros em Rotas Aninhadas
As rotas aninhadas herdam os parâmetros definidos na rota principal, o que permite uma configuração mais eficiente. Considere o seguinte exemplo no arquivo views.py
:
from django.http import HttpResponse
def index(request):
return HttpResponse("Página principal")
def products(request, id):
return HttpResponse(f"Produto {id}")
def comments(request, id):
return HttpResponse(f"Comentários sobre o produto {id}")
def questions(request, id):
return HttpResponse(f"Dúvidas sobre o produto {id}")
Aqui, as funções relacionadas a produtos utilizam o parâmetro id
, que representa o identificador do produto.
No arquivo urls.py
, as rotas podem ser configuradas de modo que o parâmetro id
seja definido na rota principal e automaticamente repassado para as rotas aninhadas:
from django.urls import path, include
from hello import views
product_routes = [
path("", views.products),
path("comments", views.comments),
path("questions", views.questions),
]
urlpatterns = [
path("", views.index),
path("products/<int:id>/", include(product_routes)),
]
Aqui, o parâmetro numérico id
é definido na rota principal products/<int:id>/
e automaticamente repassado para as sub-rotas. Dessa forma, não é necessário declarar o parâmetro id
individualmente em cada sub-rota.
Documentação oficial: