Когда я иногда читаю код django, я вижу в некоторых шаблонах reverse()
. Я не совсем уверен, что это такое, но он используется вместе с HttpResponseRedirect. Как и когда это reverse()
должно быть использовано?
Было бы хорошо, если бы кто-то дал ответ с некоторыми примерами ...
url--> view name
. Но иногда, как при перенаправлении, вам нужно пойти в обратном направлении и дать Django имя представления, и Django генерирует соответствующий URL. Другими словами,view name --> url
. То естьreverse()
(это обратная функция url). Это может показаться более прозрачным, если просто назвать его,generateUrlFromViewName
но это слишком долго и, вероятно, недостаточно широкоОтветы:
reverse()
| Джанго документацияДавайте предположим, что в вашем
urls.py
вы определили это:В шаблоне вы можете ссылаться на этот URL как:
Это будет представлено как:
Теперь предположим, что вы хотите сделать что-то похожее в вашем
views.py
- например, вы обрабатываете другой URL (не/foo/
) в другом представлении (неsome_view
) и хотите перенаправить пользователя/foo/
(часто это происходит при успешной отправке формы).Вы могли бы просто сделать:
Но что, если вы хотите изменить URL в будущем? Вы должны обновить свой
urls.py
и все ссылки на него в своем коде. Это нарушает « СУХОЙ» («Не повторяй себя») , всю идею редактирования только одного места, к чему нужно стремиться.Вместо этого вы можете сказать:
Это просматривает все URL-адреса, определенные в вашем проекте для URL-адреса, определенного с именем,
url_name
и возвращает фактический URL-адрес/foo/
.Это означает, что вы обращаетесь к URL-адресу только по его
name
атрибуту - если вы хотите изменить сам URL-адрес или представление, к которому он относится, вы можете сделать это, отредактировав только одно место -urls.py
.источник
{{ url 'url_name' }}
должно быть{% url url_name %}
в Django 1.4 или ранее. Это изменится в следующем выпуске Django (1.5) и должно быть{% url 'url_name' %}
. Документы для тега шаблона URL дают некоторую полезную информацию, если вы прокрутите немного вниз до раздела «url_reverse
. Лучший способ справиться с такими странностями - отказаться от их использования.Это старый вопрос, но кое-что может кому-то помочь.
Из официальных документов:
Например. в шаблонах (тег URL)
Например. в коде Python (используя
reverse
функцию)источник
Существующие ответы проделали большую работу по объясняя , что этой
reverse()
функции в Django.Тем не менее, я надеялся, что мой ответ пролил другой свет на вопрос « почему» : зачем использовать
reverse()
вместо других более простых, возможно, более питонических подходов в связывании шаблонов и каковы некоторые законные причины популярности этого «перенаправления черезreverse()
шаблон "в логике маршрутизации Django.Одним из ключевых преимуществ является обратная конструкция URL, как уже упоминали другие. Так же, как вы будете использовать
{% url "profile" profile.id %}
для генерации URL из файла конфигурации вашего приложения: напримерpath('<int:profile.id>/profile', views.profile, name="profile")
.Но, как отметил ФП, использование
reverse()
также обычно сочетается с использованиемHttpResponseRedirect
. Но почему?Учтите следующее
views.py
:И наш минимальный
urls.py
:В
vote()
функции код в нашемelse
блоке используетсяreverse
вместе соHttpResponseRedirect
следующим шаблоном:Это, прежде всего, означает, что нам не нужно жестко кодировать URL (в соответствии с принципом DRY), но, что более важно,
reverse()
предоставляет элегантный способ создания строк URL, обрабатывая значения, распакованные из аргументов (args=(question.id)
обрабатывается URLConfig). Предполагается, чтоquestion
имеет атрибут,id
который содержит значение5
, а URL-адрес, созданный изreverse()
этого:В обычном коде связывания представления шаблона мы используем
HttpResponse()
или,render()
поскольку они обычно включают меньше абстракции: одна функция представления возвращает один шаблон:Но во многих законных случаях перенаправления мы обычно заботимся о создании URL-адреса из списка параметров. К ним относятся такие случаи, как:
POST
запросуБольшинство из них включают в себя некоторую форму перенаправления и URL-адрес, созданный с помощью набора параметров. Надеюсь, что это добавляет к уже полезной ветке ответов!
источник
Функция поддерживает сухой принцип - гарантирует, что вы не будете использовать жесткий код в своем приложении. URL-адрес должен быть определен в одном месте, и только в одном месте - ваш URL-адрес конф. После этого вы просто ссылаетесь на эту информацию.
Используйте,
reverse()
чтобы дать вам URL страницы, указав либо путь к представлению, либо параметр page_name из вашей ссылки url. Вы бы использовали его в тех случаях, когда это не имеет смысла делать в шаблоне с{% url 'my-page' %}
.Есть много возможных мест, где вы могли бы использовать эту функцию. Я нашел его в одном месте, когда перенаправляю пользователей в виде (часто после успешной обработки формы) -
return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))
Вы также можете использовать его при написании шаблонов тегов.
В другой раз я использовал
reverse()
модель с наследованием. У меня был ListView на родительской модели, но я хотел получить от любого из этих родительских объектов к DetailView своего связанного дочернего объекта. Я прикрепилget__child_url()
функцию к родителю, которая идентифицировала существование дочернего элемента и вернула URL его DetailView, используяreverse()
.источник
Для этого есть документ
https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls
он может быть использован для генерации URL для данного представления
Основным преимуществом является то, что вы не жестко кодируете маршруты в своем коде.
источник
Существующие ответы вполне понятны. На тот случай, если вы не знаете, почему он вызывается
reverse
: он вводит имя URL-адреса и дает фактический URL-адрес, обратный первому URL-адресу, а затем дает ему имя.источник
Reverse () используется для соблюдения принципа DRY django, т. Е. Если вы измените URL в будущем, вы можете ссылаться на этот URL с помощью reverse (urlname).
источник