Django - Как передать несколько аргументов в шаблон URL-тега - PullRequest
21 голосов
/ 22 января 2010

В моем urls.py у меня есть:

(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/section/(?P<slug>[-\w]+)/$', 
    'paper.views.issue_section_detail', 
    {}, 
    'paper_issue_section_detail'
),

и я пытаюсь сделать это в шаблоне:

{% url paper_issue_section_detail issue.pub_date.year,issue.pub_date.month,issue.pub_date.day,section_li.slug %}

но я получаю эту ошибку:

TemplateSyntaxError
Caught an exception while rendering: Reverse for 'paper_issue_section_detail' with arguments '(2010, 1, 22, u'business')' and keyword arguments '{}' not found.

Однако, если я изменю шаблон URL, чтобы требовать только один аргумент, он будет работать нормально. то есть:

(r'^(?P<year>\d{4})/$', 
    'paper.views.issue_section_detail', 
    {}, 
    'paper_issue_section_detail'
),

и

{% url paper_issue_section_detail issue.pub_date.year %}

Так что кажется, что я жалуюсь, когда я передаю более одного аргумента, используя тег шаблона 'url' - я получаю ту же ошибку с двумя аргументами. Есть ли другой способ передать несколько аргументов? Я попытался передать аргументы именованного ключевого слова, и это выдает похожую ошибку.

Для чего это стоит, связанный вид начинается так:

def issue_section_detail(request, year, month, day, slug):

Как передать более одного аргумента в тег шаблона URL?

Ответы [ 3 ]

13 голосов
/ 11 марта 2012

У меня была та же проблема (я использую Django 1.3.1) и попробовал предложение Грегора Мюллеггера, но это не сработало по двум причинам:

  • между значениями года, месяца и дня не должно быть запятых
  • мой общий вид, основанный на классе, кажется, принимает только ключевые аргументы

Таким образом, единственным рабочим решением было:

{% url news_detail slug=object.slug year=object.date|date:"Y" month=object.date|date:"m" day=object.date|date:"d" %}
8 голосов
/ 22 января 2010

Проблема заключается в /(?P<month>\d{2})/ части вашей конфигурации URL. Он допускает только две цифры (\d{2}), а issue.pub_date.month - только одну цифру.

Вы можете либо разрешить ввод одной цифры в URL (но это нарушит принцип уникальности URL, /2010/1/... будет совпадать с /2010/01/...), либо передать две цифры в аргумент месяца в теге шаблона URL.
Вы можете использовать фильтр date для достижения согласованного форматирования объектов даты. Используйте тег url следующим образом:

{% url paper_issue_section_detail issue.pub_date|date:"Y",issue.pub_date|date:"m",issue.pub_date|date:"d",section_li.slug %}

Посмотрите на аргумент месяц и день: он всегда будет отображаться в виде двух цифр (с начальным нулем, если необходимо). Просмотрите документацию для тега now , чтобы узнать, какие параметры возможны для фильтра date.

5 голосов
/ 22 января 2010

Ваше выражение месяца (?P<month>\d{2}), но вы отправляете ему аргумент 1. 1 не соответствует \d{2}, поэтому распознаватель URL не находит ваш вид.

Попробуйте изменить выражение месяца на \d{1,2} (или что-то в этом роде).

...