Как генерировать URL в Django - PullRequest
       100

Как генерировать URL в Django

28 голосов
/ 04 сентября 2008

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

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

Ответы [ 3 ]

34 голосов
/ 04 сентября 2008

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

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

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

9 голосов
/ 11 сентября 2008

Я использую два разных подхода в моем 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)])
4 голосов
/ 16 сентября 2008

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

...