Quando leio código django algumas vezes, vejo em alguns modelos reverse()
. Não sei ao certo o que é isso, mas é usado junto com o HttpResponseRedirect. Como e quando isso reverse()
deve ser usado?
Seria bom se alguém desse uma resposta com alguns exemplos ...
url--> view name
. Mas às vezes, como no redirecionamento, você precisa ir na direção inversa e dar ao Django o nome de uma visualização, e o Django gera o URL apropriado. Em outras palavrasview name --> url
,. Ou seja,reverse()
(é o inverso da função url). Pode parecer mais transparente para chamá-logenerateUrlFromViewName
, mas isso é muito tempo e provavelmente não o suficiente geral: docs.djangoproject.com/en/dev/topics/http/urls/...Respostas:
reverse()
| Documentação do DjangoVamos supor que
urls.py
você tenha definido isso:Em um modelo, você pode consultar esse URL como:
Isso será renderizado como:
Agora diga que deseja fazer algo semelhante ao seu
views.py
- por exemplo, você está lidando com outra URL (não/foo/
) em outra visão (nãosome_view
) e deseja redirecionar o usuário para/foo/
(geralmente o caso de envio bem-sucedido de formulário).Você poderia apenas fazer:
Mas e se você quiser alterar o URL no futuro? Você precisaria atualizar sua
urls.py
e todas as referências a ela no seu código. Isso viola a DRY (Não se repita) , toda a idéia de editar apenas um lugar, o que é algo pelo qual se esforçar.Em vez disso, você pode dizer:
Ele procura em todos os URLs definidos no seu projeto o URL definido com o nome
url_name
e retorna o URL real/foo/
.Isso significa que você se refere ao URL apenas por seu
name
atributo - se quiser alterar o próprio URL ou a visualização a que se refere, você pode fazer isso editando apenas um local -urls.py
.fonte
{{ url 'url_name' }}
deve estar{% url url_name %}
no Django 1.4 ou anterior. Isso vai mudar no próximo lançamento do Django (1.5) e deve ser{% url 'url_name' %}
. Os docs para a url templatetag dar algumas boas informações se você rolar para baixo um pouco para a "frente de compatibilidade" seçãourl_reverse
. A melhor maneira de lidar com esses tipos de esquisitices é recusar usá-los.Esta é uma pergunta antiga, mas aqui está algo que pode ajudar alguém.
Dos documentos oficiais:
Por exemplo. em modelos (tag de URL)
Por exemplo. no código python (usando a
reverse
função)fonte
As respostas existentes fizeram um ótimo trabalho ao explicar o quê dessa
reverse()
função no Django.No entanto, esperava que minha resposta esclarecesse o porquê : por que usar
reverse()
no lugar de outras abordagens mais diretas e discutivelmente mais pitônicas na ligação de exibição de modelo e quais são algumas das razões legítimas para a popularidade desse "redirecionamento viareverse()
padrão "na lógica de roteamento do Django.Um benefício importante é a construção reversa de um URL, como outros mencionaram. Assim como você usaria
{% url "profile" profile.id %}
para gerar o URL a partir do arquivo de configuração de URL do seu aplicativo: por exemplopath('<int:profile.id>/profile', views.profile, name="profile")
.Mas, como o OP observou, o uso de
reverse()
também é comumente combinado com o uso deHttpResponseRedirect
. Mas por que?Considere o seguinte
views.py
:E nosso mínimo
urls.py
:Na
vote()
função, o código em nossoelse
bloco usareverse
junto comHttpResponseRedirect
o seguinte padrão:Em primeiro lugar, significa que não precisamos codificar a URL (consistente com o princípio DRY), mas, mais crucialmente,
reverse()
fornece uma maneira elegante de construir cadeias de URL manipulando valores descompactados dos argumentos (args=(question.id)
é tratado por URLConfig). Supostoquestion
tem um atributoid
que contém o valor5
, a URL construída a partir doreverse()
seria então:No código de ligação normal da visualização de modelo, usamos
HttpResponse()
ou,render()
como geralmente envolvem menos abstração: uma função de exibição retornando um modelo:Mas em muitos casos legítimos de redirecionamento, normalmente nos preocupamos em construir o URL a partir de uma lista de parâmetros. Isso inclui casos como:
POST
solicitaçãoA maioria delas envolve alguma forma de redirecionamento e uma URL construída através de um conjunto de parâmetros. Espero que isso melhore o já útil tópico de respostas!
fonte
A função suporta o princípio seco - garantindo que você não codifique os URLs em todo o aplicativo. Um URL deve ser definido em um lugar e apenas em um lugar - seu URL conf. Depois disso, você está realmente apenas referenciando essas informações.
Use
reverse()
para fornecer o URL de uma página, o caminho para a exibição ou o parâmetro page_name do seu URL conf. Você o usaria nos casos em que não faz sentido fazê-lo no modelo{% url 'my-page' %}
.Existem muitos lugares possíveis em que você pode usar essa funcionalidade. Um local que descobri que uso é ao redirecionar usuários em uma exibição (geralmente após o processamento bem-sucedido de um formulário) -
return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))
Você também pode usá-lo ao escrever tags de modelo.
Outra vez que usei
reverse()
foi com herança de modelo. Eu tinha um ListView em um modelo pai, mas queria ir de qualquer um desses objetos pai para o DetailView do objeto filho associado. Anexei umaget__child_url()
função ao pai, que identificou a existência de um filho e retornou o URL do DetailView usandoreverse()
.fonte
Existe um documento para isso
https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls
pode ser usado para gerar um URL para uma determinada visualização
A principal vantagem é que você não codifica rotas no seu código.
fonte
As respostas existentes são bastante claras. Apenas no caso de você não saber por que ele é chamado
reverse
: ele recebe uma entrada com um nome de URL e fornece o URL real, o que é inverso ao primeiro ter um URL e, em seguida, nomeá-lo.fonte
O reverse () é usado para aderir ao princípio django DRY, ou seja, se você alterar o URL no futuro, poderá referenciá-lo usando reverse (urlname).
fonte