Існуючі відповіді зробили чудову роботу в поясненні того, що ця 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/…