Как генерировать URL-адреса в django
В языке шаблонов Django вы можете использовать {% url [viewname] [args] %}
для создания URL-адреса для определенного представления с параметрами. Как вы можете программно сделать то же самое в коде Python?
Мне нужно создать список пунктов меню, в которых каждый элемент имеет имя, URL и активный флаг (будь то текущая страница или нет). Это связано с тем, что в Python это будет намного чище, чем язык шаблонов.
Ответы
Ответ 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})