Как сгенерировать URL-адреса в django
-
09-06-2019 - |
Вопрос
На языке шаблонов Django вы можете использовать {% url [viewname] [args] %}
сгенерировать URL-адрес для определенного представления с параметрами.Как вы можете программно сделать то же самое в коде Python?
Что мне нужно, так это создать список пунктов меню, где у каждого элемента есть имя, URL и активный флаг (независимо от того, является ли это текущая страница или нет).Это потому, что сделать это на Python будет намного проще, чем на языке шаблонов.
Решение
Если вам нужно использовать что-то похожее на {% url %}
тег шаблона в вашем коде Django предоставляет django.core.urlresolvers.reverse()
.Тот Самый reverse
функция имеет следующую сигнатуру:
reverse(viewname, urlconf=None, args=None, kwargs=None)
Другие советы
В своей работе я использую два разных подхода 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% безошибочным и мог быть обработан - iow no ViewDoesNotExist
ошибки или около того, или вы получите страшное NoReverseMatch
исключение (ошибки в шаблонах обычно завершаются безрезультатно, что приводит к None
).