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

Phi*_*ord 21 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'
),
Run Code Online (Sandbox Code Playgroud)

而我正在尝试在模板中执行此操作:

{% url paper_issue_section_detail issue.pub_date.year,issue.pub_date.month,issue.pub_date.day,section_li.slug %}
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

TemplateSyntaxError
Caught an exception while rendering: Reverse for 'paper_issue_section_detail' with arguments '(2010, 1, 22, u'business')' and keyword arguments '{}' not found.
Run Code Online (Sandbox Code Playgroud)

但是,如果我将URL模式更改为只需要一个参数,它就可以正常工作.即:

(r'^(?P<year>\d{4})/$', 
    'paper.views.issue_section_detail', 
    {}, 
    'paper_issue_section_detail'
),
Run Code Online (Sandbox Code Playgroud)

和:

{% url paper_issue_section_detail issue.pub_date.year %}
Run Code Online (Sandbox Code Playgroud)

所以当我使用'url'模板标签传递多个参数时似乎抱怨 - 我用两个参数得到了相同的错误.是否有不同的方式来传递几个参数?我尝试传入命名关键字参数,并生成类似的错误.

对于它的价值,相关视图如下所示:

def issue_section_detail(request, year, month, day, slug):
Run Code Online (Sandbox Code Playgroud)

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

Vla*_* T. 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" %}
Run Code Online (Sandbox Code Playgroud)


Gre*_*ger 8

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

您可以在URL中同时允许一个数字(但这将违反唯一URL的原则,/2010/1/...将与之相同/2010/01/...)或将两位数传递给url templatetag中的month参数.
您可以使用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 %}
Run Code Online (Sandbox Code Playgroud)

查看月和日参数:它将始终显示为两位数(如果需要,前导零).查看now标签文档,了解date过滤器可以使用哪些选项.


Set*_*eth 5

你的月份表达式是(?P<month>\d{2}),但你发送的是参数1.的1不匹配\d{2},所以在URL解析没有发现你的看法.

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