Django - 如何将多个参数传递给url模板标记

时间:2010-01-22 18:18:42

标签: django django-templates django-urls

在我的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 个答案:

答案 0 :(得分:13)

我有同样的问题(我正在使用Django 1.3.1)并尝试了GregorMüllegger的建议,但这有两个原因:

  • 年,月,日值之间不应有逗号
  • 我的基于类的通用视图似乎只采用关键字参数

因此唯一可行的解​​决方案是:

{% url news_detail slug=object.slug year=object.date|date:"Y" month=object.date|date:"m" day=object.date|date:"d" %}

答案 1 :(得分:8)

问题存在于网址配置的/(?P<month>\d{2})/部分。它只允许两位数(\d{2})而issue.pub_date.month只有一位数。

您可以在网址中同时允许一位数字(但这会违反唯一网址的原则,/2010/1/...将与/2010/01/...相同)或将两位数传递给月份参数你的网址模板标签 您可以使用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 %}

查看月份和日期参数:它将始终显示为两位数(如果需要,前导零)。请查看documentation of the now tag,了解date过滤器可能的选项。

答案 2 :(得分:5)

您的月份表达式为(?P<month>\d{2}),但您发送的是1参数。 1\d{2}不匹配,因此网址解析程序找不到您的视图。

尝试将月份表达式更改为\d{1,2}(或类似的效果)。

相关问题