Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 591
fstab Avatar asked Dec 16 '13 16:12

fstab


2 Answers

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.

like image 168
bruno desthuilliers Avatar answered Nov 14 '22 22:11

bruno desthuilliers


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 %}
like image 22
niekas Avatar answered Nov 15 '22 00:11

niekas