stympel
@stympel
подпивасник

Зачем нужен reverse()?

Всем привет, прочитал доку, вроде бы и понятно, но как-то непонятно. Кто может понятно объяснить, зачем нужен reverse()? Зачем он нужен в принципе и зачем он нужен в частности в get_absolute_url?
  • Вопрос задан
  • 6775 просмотров
Решения вопроса 1
deepblack
@deepblack Куратор тега Django
reverse позволяет по имени вьюхи получить её url.

from news import views

path('archive/', views.archive, name='news-archive')


from django.urls import reverse

reverse('news-archive')


get_absolute_url - позволяет получить канонический URL обьекта, при условии что этот метод определён.

# Можно так:
def get_absolute_url(self):
    return "/people/%i/" % self.id

# Но лучше так:
def get_absolute_url(self):
    from django.urls import reverse
    return reverse('people.views.details', args=[str(self.id)])


<a href="{{ object.get_absolute_url }}">{{ object.name }}</a>


Ну и в догонку:

spoiler
<!-- Так не надо делать -->
<a href="/language/category/product/{{product.pk}}">Link</a>

<!-- надо так -->
<a href="{{product.get_absolute_url}}">Link</a>

Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Putigor
Например, у нас есть такая страница в urls.py:
urlpatterns = [
    path('articles/<int:year>/<int:month>/<int:day>/', views.day_archive, name='day_archive'),
    ...
]

Мы можем во views.py сделать так:
def ...
                year = request.POST.get("year")
                month = request.POST.get("month")
                day = request.POST.get("day")
                return HttpResponseRedirect('articles/' + year + '/' + month + '/' + day + '/')

А можем вот так:
from django.urls import reverse

def ...
                year = request.POST.get("year")
                month = request.POST.get("month")
                day = request.POST.get("day")
                return HttpResponseRedirect(reverse('day_archive', args=[year, month, day]))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы