13

I have a jinja2 template which I reuse for different Flask routes. All of these routes have a single required parameter and handle only GET requests, but some routes may have extra arguments.

Is there a way to append extra arguments onto url_for()?


Something like

url_for(my_custom_url, oid=oid, args=extra_args)

which will render to (depending on the route endpoint):

# route 'doit/<oid>' with arguments
doit/123?name=bob&age=45

# route 'other/<oid>' without arguments
other/123

My use case would be to provide links with predefined query arguments:

<a href=" {{ url_for('doit', oid=oid, args=extra_args }} ">A specific query</a>
<a href=" {{ url_for('other', oid=oid) }} ">A generic query</a>

I would like to run this template without JavaScript, so I would not like to assign a click listener and use AJAX to do a GET request for each link if that is possible.

2 Answers 2

17

Any arguments that don't match route parameters will be added as the query string. Assuming extra_args is a dict, just unpack it.

extra_args = {'hello': 'world'}
url_for('doit', oid=oid, **extra_args)
# /doit/123?hello=world
url_for('doit', oid=oid, hello='davidism')
# /doit/123?hello=davidism

Then access them in the view with request.args:

@app.route('/doit/<int:oid>')
def doit(oid)
    hello = request.args.get('hello')
    ...
Sign up to request clarification or add additional context in comments.

Comments

-1

Using your example, this wound generate the URLs like you requested if you know your arguments in advance.

<a href=" {{ url_for('doit', oid=oid, name='bob', age=45 }} ">A specific query</a>

<a href=" {{ url_for('other', oid=oid) }} ">A generic query</a>

@davidism's answer would be preferred if your set of arguments isn't known until runtime and are stored in a dictionary.

Comments

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.