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

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\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.

Trackback URL for this post:

http://www.ventanazul.com/webzine/trackback/120

Reply

The content of this field is kept private and will not be shown publicly.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <h1> <h2> <h3> <h4>
  • Lines and paragraphs break automatically.

More information about formatting options