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






Если вам нужно использовать в своем коде что-то похожее на тег шаблона {% url %}, Django предоставляет django.core.urlresolvers.reverse(). Функция reverse имеет следующую сигнатуру:
reverse(viewname, urlconf=None, args=None, kwargs=None)
https://docs.djangoproject.com/en/dev/ref/urlresolvers/
На момент редактирования это импорт django.urls import reverse.
В моем 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)])
Имейте в виду, что использование reverse() требует, чтобы ваш модуль urlconf был на 100% свободен от ошибок и мог быть обработан - в этом случае никаких ошибок ViewDoesNotExist или около того, или вы получите ужасное исключение NoReverseMatch (ошибки в шаблонах обычно завершаются с ошибкой, что приводит к None).
Для Python3 и Django 2:
from django.urls import reverse
url = reverse('my_app:endpoint', kwargs = {'arg1': arg_1})
Это то же самое, что использовать декоратор? @ models.permalink