Існуючі відповіді зробили чудову роботу в поясненні того, що ця reverse()функція в Джанго.
Однак я сподівався, що моя відповідь проливає інше світло на те, чому : чому використовувати reverse()замість інших більш прямих, можливо більш пітонічних підходів у прив'язці перегляду шаблонів, і які є законні причини для популярності цього "переадресації через reverse() шаблон "в логіці маршрутизації Джанго.
Однією з головних переваг є зворотна побудова URL-адреси, як згадували інші. Так само, як би ви використовували {% url "profile" profile.id %}для створення URL-адреси з файлу конфігурації URL-адреси програми: наприклад path('<int:profile.id>/profile', views.profile, name="profile").
Але, як зазначають ОП, використання reverse()також зазвичай поєднується із використанням HttpResponseRedirect. Але чому?
Я не зовсім впевнений, що це, але він використовується разом з HttpResponseRedirect. Як і коли передбачається використовувати цей зворотний ()?
Розглянемо наступне 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. Але іноді, як, наприклад, під час переадресації, потрібно йти у зворотному напрямку та надати Джанго ім'я перегляду, і Джанго генерує відповідний URL. Іншими словами,view name --> url. Тобтоreverse()(це зворотна функція url). Це може здатися більш прозорим, щоб просто назвати це,generateUrlFromViewNameале це занадто довго і, мабуть, недостатньо загально: docs.djangoproject.com/en/dev/topics/http/urls/…