Compartilhando rotas entre apps no Django

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.

Django - Desenvolvimento de APIs REST
Curso de Django - Desenvolvimento de APIs REST
CONHEÇA O CURSO

Alé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.

Deixe seu comentário

Professor na TreinaWeb e graduando em Sistemas de Informação pelo Instituto Federal da Bahia. Apaixonado por desenvolvimento web, desktop e mobile desde os 12 anos de idade. Já utilizou todos os sistemas operacionais possíveis, mas hoje se contenta com o OSX instalado em seu notebook Samsung. Até passou em uma peneira do Cruzeiro, mas preferiu estudar Python.