fstab
fstab

Reputation: 5029

django templates : how to expand a variable into the string argument for the built-in tag `url`

I am trying to make the following template snippet work:

<ul>
  {% for name,label in entries.items %}
    <li><a href="{% url name %}">{{ label }}</a></li>
  {% endfor %}
</ul>

As you can see name is a variable that I need to expand into string before passing it to the url built-in tag.

Unfortunately the aforementioned template snippet results in the following exception:

Exception Type: TemplateSyntaxError
Exception Value:    
Caught NoReverseMatch while rendering: Reverse for 'name' with arguments '()' and keyword arguments '{}' not found.

Any ideas or alternative methods on how to achieve this?

Upvotes: 5

Views: 685

Answers (2)

niekas
niekas

Reputation: 9107

You can pass variable to {% url %} templatetag. If name is valid urlpattern name this snippet should work.

If you need to convert name to a valid urlpattern name, you can do it by using custom filter, like this:

{% url name|my_filter %}

Upvotes: 3

bruno desthuilliers
bruno desthuilliers

Reputation: 77912

Your code should work for Django >= 1.4 (iirc) - assuming name resolves to a valid url name and this url don't need args or kwargs. For Django 1.3x you have to add {% load url from future %} to your template for this to work. For django < 1.3 you're out of luck (well, you'll have to write a custom tag) - but you should possibly consider porting your code anyway.

Upvotes: 3

Related Questions