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

21

在我的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

我遇到了相同的问题(我正在使用Django 1.3.1),并尝试了Gregor Müllegger的建议,但由于两个原因,那些都无法解决问题:

  • 年份、月份和日期之间不应该有逗号
  • 我的基于类的通用视图似乎只接受关键字参数

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

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

8
问题出现在您的URL配置的/(?P<month>\d{2})/部分。它只允许恰好两个数字(\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过滤器的可能选项。


听起来很不错 - 我真的不想改变URL的可能格式。但是当我执行issue.pub_date.month|date:"m"时,空字符串会传递到URL/view。 - Phil Gyford
1
没错 - 很抱歉。我在原始帖子中显然弄错了。我已经纠正了 url 标签。你应该使用 issue.pub_date|date:"m" 而不是 issue.pub_date.month|date:"m"date 过滤器作用于 datetime 对象(pub_date 属性),而不是整数(pub_date.month 属性)。 - Gregor Müllegger
嗯,当然,我也应该能发现那个问题。非常感谢你的帮助,Gregor。 - Phil Gyford

5

您的月份表达式是(?P<month>\d{2}),但您正在将参数1发送给它。 1\d{2}不匹配,因此URL解析器无法找到您的视图。

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


非常感谢你的建议 Seth - 我之前没有将正则表达式和我想要传递给它的内容联系起来。但是我不想放松对URL的限制,所以现在我正在改变传递内容的格式,采用 Gregor Müllegger 的建议。 - Phil Gyford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接