Um projeto Django é composto por uma ou mais aplicações, que possui um arquivo de rotas. Agora imagine que tenhamos duas apps com rotas de mesmo nome ou que precisamos executar métodos de uma outra app … Como diferenciar cada rota dentro do projeto e como compartilhar as rotas entre as aplicações de um projeto? É o que veremos neste artigo.
Utilizando namespaces no Django
A compartilhação de rotas entre apps no Django é muito simples. A primeira coisa a se fazer é determinar o namespace
daquele arquivo de rotas. Este namespace
é o que define de onde a rota pertence (a qual app aquela rota foi criada).
Imagine que você tenha um projeto com duas (ou mais) aplicações e que há rotas nessas aplicações que são compartilhadas entre as apps. Para realizar este “compartilhamento”, precisamos definir o nome do namespace de cada arquivo de rotas. É este nome que identificará de onde a rota será chamada.
Para isso, no arquivo urls.py da app que queremos compartilhar as rotas, definimos a seguinte configuração no app_name
:
from django.urls import path
from .views import *
app_name = 'admin_blog'
urlpatterns = [
path('listar_posts/', listar_posts, name='listar_posts'),
path('editar_post/<int:id>', editar_post, name='editar_post'),
path('remover_post/<int:id>', remover_post, name='remover_post'),
path('cadastrar_post/', cadastrar_post, name='cadastrar_post'),
]
É o conteúdo do app_name
que determina como chamaremos as rotas externamente.
Curso Django - Desenvolvimento de APIs REST
Conhecer o cursoAlém disso, precisamos determinar que o conjunto de rotas da app possui o namespace
‘admin_blog’ no arquivo de rotas do projeto:
urlpatterns = [
path('admin_blog/', include('admin_blog.urls', namespace='admin_blog')),
#...
]
Invocando rotas em outras apps com Django
Agora que determinamos a configuração do app_name
no arquivo de rotas da aplicação, podemos executá-las externamente. Para isso, a nomenclatura é a seguinte:
nome_definido_no_app_name:nome_da_rota
Sendo assim, se quisermos executar a rota ‘listar_posts’, por exemplo, a partir de um template localizado em outra app, definimos a tag url
da seguinte forma:
<li class="nav-item">
<a class="nav-link" href="{% url 'admin_blog:listar_posts' %}">Admin</a>
</li>
Com isso, a rota a ser executada será do método listar_posts
que está definido na outra app do projeto.