что такое reverse () в Django

когда я иногда читаю код django, я вижу в некоторых шаблонах reverse(). Я не совсем уверен, что это, но он используется вместе с HttpResponseRedirect. Как и когда это reverse() предполагается использовать?

было бы неплохо, если бы кто-то дал ответ с примерами...

5 ответов


https://docs.djangoproject.com/en/stable/ref/urlresolvers/#reverse

в своем urls.py определить следующим образом:

url(r'^foo$', some_view, name='url_name'),

в шаблоне вы можете ссылаться на этот url как:

<!-- django <= 1.4 -->
<a href="{% url url_name %}">link which calls some_view</a>

<!-- django >= 1.5 or with {% load url from future %} in your template -->
<a href="{% url 'url_name' %}">link which calls some_view</a>

это будет отображаться как

<a href="/foo/">link which calls some_view</a>

теперь скажите, что вы хотите сделать что-то подобное в вашем views.py - например, вы обрабатываете какой-то другой url (не /foo/) в каком-то другом представлении (не some_view) и вы хотите перенаправить пользователя на /foo/ (часто бывает по успешной подаче формы)

вы могли бы просто сделать

return HttpResponseRedirect('/foo/')

но что, если вы хотите изменить URL-адрес в будущем - вам придется обновить ваш urls.py и все ссылки на него в коде. Это нарушает сухой (google it).

вместо этого вы можете сказать

from django.urls import reverse
return HttpResponseRedirect(reverse('url_name'))

это просматривает все URL-адреса, определенные в вашем проекте для url-адреса, определенного с именем url_name и возвращает фактический url /foo/.

это означает, что вы ссылаетесь на url только его name атрибут-если вы хотите изменить сам url или представление, на которое он ссылается, вы можете сделать это, отредактировав только одно место -urls.py. Вся эта идея редактирования только одного места упоминается как "не повторяйте себя" и является чем-то, к чему нужно стремиться.


для этого есть док

https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls

его можно использовать для создания URL-адреса для данного представления

главным преимуществом является то, что вы не жесткий код маршрутов в вашем коде.


Это старый вопрос, но вот то, что может помочь кому-то.

из официальных документов:

Django предоставляет инструменты для выполнения обратного URL-адреса, которые соответствуют различные слои, где необходимы URL-адреса: в шаблонах: использование url-адреса тег шаблона. В коде Python: использование функции reverse (). In higher код уровня, связанный с обработкой URL-адресов экземпляров модели Django: get_absolute_url() метод.

например. в шаблоны (тега url)

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>

например. в коде python (используя


функция поддерживает сухой принцип-гарантируя, что вы не жесткий код URL-адреса во всем вашем приложении. Url должен быть определен в одном месте, и только в одном месте - Ваш url conf. После этого вы просто ссылаетесь на эту информацию.

использовать reverse() чтобы дать вам url-адрес страницы, учитывая либо путь к представлению, либо параметр page_name из вашего url conf. Вы бы использовали его в случаях, когда нет смысла делать это в шаблоне с {% url 'my-page' %}.

там много возможных мест вы можете использовать эту функцию. Одно место, которое я нашел, я использую при перенаправлении пользователей в представлении (часто после успешной обработки формы) -

return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))

вы также можете использовать его при написании шаблонов.

в другой раз я использовал reverse() был с наследованием модели. У меня был ListView на родительской модели, но я хотел получить от любого из этих родительских объектов DetailView связанного с ним дочернего объекта. Я прикрепил а get__child_url() функция для родителя, который определил существование ребенка и вернул url-адрес его DetailView с помощью reverse().


reverse () используется для соблюдения принципа сухого django i.e если вы измените url-адрес в будущем, вы можете ссылаться на этот url-адрес с помощью reverse (urlname).