O uso de namespace no Django
Tags: django, python
Published: 2020-01-02 18:43:55

Segundo o [Zen Of Python](https://pythonacademy.com.br/zen-of-python), namespace são uma ótima ideia e no Django elas estão presentes e eu diria que são essenciais para ter um código fácil de ler e de manter.

No Django, os namespace estão presentes na nomeação das urls (exato, dá para colocar nomes às urls) e na estrutura de pastas dos `templates` e recursos estáticos.

## Nas urls

Nas urls, o uso de namespace aparece em dois momentos. Quando se dar um nome a uma função que está sendo roteada e quando o arquivo de urls pai está direcionando as requisições para um arquivo de urls filho.

{% gist https://gist.github.com/rjLelis/0f5c862d3319f6fe824b2059f869eb50 %}

Aqui, quando uma requisição for direcionada à rota `'https://<dominio.com>/usuario`', as requisições vão ser redirecionadas para as urls do arquivo url.py no modulo usuario. O argumento namespace vai ser o nome do app para qual o as requisições irão ser redirecionadas.

{% gist https://gist.github.com/rjLelis/d7c25a9e35c60b5466e79e88c3dd71c2 %}

No arquivo de urls filho, deve-se criar uma variável chamada namespace, seu valor sendo o mesmo nome dado no arquivo de urls pai, e o último argumento da função `“path”` vai ser o nome da função. Internamente, o Django vai concatenar esses dois nomes, ficando `“usuario:list”`. Isso é útil quando você precisar redirecionar esta url. Em vez de usar `“/usuario/usuarios”` você usar `“reverse(‘usuario:list’)”`, mais legível e mais prático.

Dentro das páginas html, as urls também podem ser referenciadas pelo namespace. Usando a tag especial `url`, você pode converter de `namespace` para url seguindo o mesmo princípio de legibilidade e praticidade.

{% gist https://gist.github.com/rjLelis/2d0bccfa51d77dbfed3b942b7c0631e1 %}

## Nos templates

Nos templates, os namespaces ajudam a referenciar os arquivos html e os arquivos estáticos dentro de funções e até dentro dos próprios `templates`.

Ao criar um app no Django que irá conter `templates`, o indicado é criar uma pasta chamada `“templates”` e dentro dela criar outra pasta com o mesmo nome no app e aí sim guardar as páginas html dentro desta última pasta.

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/lkx280ozt5w6f36c58wq.png)

O mesmo vale para os arquivos estáticos. Se cria uma pasta chamada static, uma com o mesmo nome da app e as pastas dos respectivos tipos de arquivos (css, imagens e javascript).

No código, os `templates` vão ser referenciados nas `views`.

{% gist https://gist.github.com/rjLelis/91157264feac10dd1d3df7de13c6b6d3 %}

Assim como nas urls basta passar o nome do app e, separando por uma barra, o nome do arquivo html.

Os arquivos estáticos vão ser referenciados dentro dos templates.

{% gist https://gist.github.com/rjLelis/0545e08850945b1e6441b230d639e349 %}

Os namespace são passados na tag `static`, passando o caminho relativo, seguindo o exemplo dos templates. Para usar a tag `static` é preciso carregá-la através da tag `load`, bem na linha 1.

O próximo programador que irá dar manutenção ao seu código agradece

Vimos nesse artigo o quanto namespaces nos ajudam na leitura do nosso código e facilita a manutenção.

> É importante lembrar de escrever código que outros programadores entendem, não só você.

E nisso, o Django ajuda e muito.