23

I have a route defined like this:

@app.route('/magic/<filename>')
def moremagic(filename):
    pass

And now in a template I want to call that route using url_for() like so:

<h1>you uploaded {{ name }}<h1>
<a href="{{ url_for('/magic/<filename>') }}">Click to see magic happen</a>

I have tried:

<a href="{{ url_for('/magic', filename={{ name }}) }}">Click to see magic happen</a>

That throws a jinja2.TemplateSyntaxError: expected token ':' got }

Can anyone suggest how to get the {{ name }} that appears in the template into the url_for() so that when I click I call the correct app.route?

1 Answer 1

40

Everything inside the {{ ... }} is a Python-like expression. You don't need to use another {{ ... }} inside that to reference variables.

Drop the extra brackets:

<h1>you uploaded {{ name }}<h1>
<a href="{{ url_for('moremagic', filename=name) }}">Click to see magic happen</a>

(Note that the url_for() function takes the endpoint name, not a URL path; the name defaults to the name of the function, moremagic in your example).

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.