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?
Ответы
Ответ 1
Проблема находится в части /(?P<month>\d{2})/
вашей конфигурации URL-адреса. Он допускает только две цифры (\d{2}
), а issue.pub_date.month
- только одна цифра.
Вы можете либо разрешить также одну цифру в URL-адресе (но это будет нарушать принцип уникальных URL-адресов, /2010/1/...
будет таким же, как /2010/01/...
), или передать две цифры аргументу месяца в вашем шаблоне 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, чтобы узнать, какие параметры возможны для фильтра date
.
Ответ 2
У меня была та же проблема (я использую 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" %}
Ответ 3
Ваше выражение месяца (?P<month>\d{2})
, но вы отправляете ему аргумент 1
. 1
не соответствует \d{2}
, поэтому распознаватель url не находит ваше представление.
Попробуйте изменить выражение месяца на \d{1,2}
(или что-то в этом роде).