Passing variables to named patterns via {% url %} in Django templates

Grab the feed

School is a twelve-year jail sentence where bad habits are the only curriculum truly learned.

John Taylor Gatto

Recent comments

When coding Django one of my most important goals is avoiding all kind of hardcoded urls in my applications. Let's see this line from one of my app's URLConf:

url(r'^edit/object/(?P<object_id>\w+)/$', 'object_edit', name='object_edit'),

This points to a page like /edit/object/123, notice I'm using a named pattern here, and calls a view defined with:

def object_edit(request, object_id):

Then I can do what I need with the object identified by object_id.

Now, imagine I have a list of objects in a template so I can add an edit link to each one of them, something like this:

<a href="{% url object_edit object_id=4}">edit object</a>

Notice that 4? I put it there just for making my point clear, what I really want to do is something like:

<a href="{% url object_edit object_id={{ object.object_id }} %}">edit object</a>

but that produces an error like this: TemplateSyntaxError at ... Could not parse the remainder: '{{' from '{{'.

It seems a template variable can't be used inside a {% url %} tag, and I guess the same applies to any template tag. After thinking a bit about how other tags work with variables, the {% for %} loop for example, I decided to get rid of the {{ and }}:

<a href="{% url object_edit object_id=object.object_id %}">edit object</a>

And yep, that worked. I hope this helps anybody else having a similar question.

Join the conversation

Thanks, solved my problem

Thanks, solved my problem

Keep your comments relevant, written in good English and don't spam. Let's create useful and valuable discussions. Markdown is welcome.

Add your comment