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 via reverse()
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 exemplo path('<int:profile.id>/profile', views.profile, name="profile")
.
Mas, como o OP observou, o uso de reverse()
também é comumente combinado com o uso de HttpResponseRedirect
. Mas por que?
Não sei ao certo o que é isso, mas é usado junto com o HttpResponseRedirect. Como e quando esse reverse () deve ser usado?
Considere o seguinte views.py
:
from django.http import HttpResponseRedirect
from django.urls import reverse
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected = question.choice_set.get(pk=request.POST['choice'])
except KeyError:
# handle exception
pass
else:
selected.votes += 1
selected.save()
return HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
))
E nosso mínimo urls.py
:
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('<int:question_id>/results/', views.results, name='polls-results'),
path('<int:question_id>/vote/', views.vote, name='polls-vote')
]
Na vote()
função, o código em nosso else
bloco usa reverse
junto com HttpResponseRedirect
o seguinte padrão:
HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
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). Suposto question
tem um atributo id
que contém o valor 5
, a URL construída a partir do reverse()
seria então:
'/polls/5/results/'
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:
def index(request):
return render(request, 'polls/index.html')
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:
- Envio de formulário HTML por
POST
solicitação
- Pós-validação de login do usuário
- Redefinir senha por meio de tokens da Web JSON
A 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!
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/...