Подтвердить что ты не робот

Как генерировать URL-адреса в django

В языке шаблонов Django вы можете использовать {% url [viewname] [args] %} для создания URL-адреса для определенного представления с параметрами. Как вы можете программно сделать то же самое в коде Python?

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

4b9b3361

Ответ 1

Если вам нужно использовать что-то похожее на тег шаблона {% url %} в вашем коде, Django предоставляет django.core.urlresolvers.reverse(). Функция reverse имеет следующую подпись:

reverse(viewname, urlconf=None, args=None, kwargs=None)

https://docs.djangoproject.com/en/dev/ref/urlresolvers/

Ответ 2

В моем models.py я использую два разных подхода. Первый - декоратор permalink:

from django.db.models import permalink

def get_absolute_url(self): 
    """Construct the absolute URL for this Item."""
    return ('project.app.views.view_name', [str(self.id)])
get_absolute_url = permalink(get_absolute_url)

Вы также можете напрямую вызвать reverse:

from django.core.urlresolvers import reverse

def get_absolute_url(self): 
    """Construct the absolute URL for this Item."""
    return reverse('project.app.views.view_name', None, [str(self.id)])

Ответ 3

Имейте в виду, что использование reverse() требует, чтобы ваш модуль urlconf был на 100% безошибочным и может быть обработан - iow no ViewDoesNotExist ошибки или так, или вы получаете страшное исключение NoReverseMatch (ошибки в шаблонах обычно терпят неудачу молча в результате чего None).

Ответ 4

Для Python3 и Dajango 2:

from django.urls import reverse

url = reverse('my_app:endpoint', kwargs={'arg1': arg_1})