Django - How to pass several arguments to the url template tag

Phil Gyford picture Phil Gyford · Jan 22, 2010 · Viewed 27.1k times · Source

In my urls.py I have:

(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'
),

and I'm trying to do this in a template:

{% url paper_issue_section_detail issue.pub_date.year,issue.pub_date.month,issue.pub_date.day,section_li.slug %}

but I get this error:

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

However, if I change the URL pattern to only require a single argument it works fine. ie:

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

and:

{% url paper_issue_section_detail issue.pub_date.year %}

So it seems to complain when I pass more than a single argument using the 'url' template tag - I get the same error with two arguments. Is there a different way to pass several arguments? I've tried passing in named keyword arguments and that generates a similar error.

For what it's worth, the related view starts like this:

def issue_section_detail(request, year, month, day, slug):

How do I pass more than a single argument to the url template tag?

Answer

Vlad T. picture Vlad T. · Mar 11, 2012

I had the same issue (I'm using Django 1.3.1) and tried Gregor Müllegger's suggestion, but that didn't work for two reasons:

  • there should be no commas between year, month and day values
  • my class-based generic view seems to take only keyword arguments

Thus the only working solution was:

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