Django - как передать несколько аргументов тегу шаблона url

в моем 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 ответов


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

вы можете сделать либо разрешить также одну цифру в URL (но это нарушит принцип уникальных URL,/2010/1/... было бы то же самое, что /2010/01/...) или передайте две цифры аргументу месяца в вашем url templatetag.
Вы можете использовать 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 чтобы увидеть, какие варианты возможны для .


У меня была та же проблема (я использую 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" %}

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

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