Существующие ответы проделали большую работу по объясняя , что этой reverse()
функции в Django.
Тем не менее, я надеялся, что мой ответ пролил другой свет на вопрос « почему» : зачем использовать reverse()
вместо других более простых, возможно, более питонических подходов в связывании шаблонов и каковы некоторые законные причины популярности этого «перенаправления через reverse()
шаблон "в логике маршрутизации Django.
Одним из ключевых преимуществ является обратная конструкция URL, как уже упоминали другие. Так же, как вы будете использовать {% url "profile" profile.id %}
для генерации URL из файла конфигурации вашего приложения: например path('<int:profile.id>/profile', views.profile, name="profile")
.
Но, как отметил ФП, использование reverse()
также обычно сочетается с использованием HttpResponseRedirect
. Но почему?
Я не совсем уверен, что это такое, но он используется вместе с HttpResponseRedirect. Как и когда должен использоваться этот reverse ()?
Учтите следующее 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)
))
И наш минимальный 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')
]
В vote()
функции код в нашем else
блоке используется reverse
вместе со HttpResponseRedirect
следующим шаблоном:
HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
Это, прежде всего, означает, что нам не нужно жестко кодировать URL (в соответствии с принципом DRY), но, что более важно, reverse()
предоставляет элегантный способ создания строк URL, обрабатывая значения, распакованные из аргументов ( args=(question.id)
обрабатывается URLConfig). Предполагается, что question
имеет атрибут, id
который содержит значение 5
, а URL-адрес, созданный из reverse()
этого:
'/polls/5/results/'
В обычном коде связывания представления шаблона мы используем HttpResponse()
или, render()
поскольку они обычно включают меньше абстракции: одна функция представления возвращает один шаблон:
def index(request):
return render(request, 'polls/index.html')
Но во многих законных случаях перенаправления мы обычно заботимся о создании URL-адреса из списка параметров. К ним относятся такие случаи, как:
- Отправка HTML-формы по
POST
запросу
- Пост-проверка логина пользователя
- Сбросить пароль через веб-токены JSON
Большинство из них включают в себя некоторую форму перенаправления и URL-адрес, созданный с помощью набора параметров. Надеюсь, что это добавляет к уже полезной ветке ответов!
url--> view name
. Но иногда, как при перенаправлении, вам нужно пойти в обратном направлении и дать Django имя представления, и Django генерирует соответствующий URL. Другими словами,view name --> url
. То естьreverse()
(это обратная функция url). Это может показаться более прозрачным, если просто назвать его,generateUrlFromViewName
но это слишком долго и, вероятно, недостаточно широко