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

django, django-templates, python, templates

Solution

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.

Problem

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?

Original source