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}
(или что-то в этом роде).