135
votes

I'd like to add request parameters to a {% url %} tag, like ?office=foobar.

Is this possible? I can't find anything on it.

6
See this answer for a simple custom template tag to render query strings.Christian Long

6 Answers

197
votes

No, because the GET parameters are not part of the URL.

Simply add them to the end:

<a href="{% url myview %}?office=foobar">

For Django 1.5+

<a href="{% url 'myview' %}?office=foobar">
40
votes

A way to mix-up current parameters with new one:

{% url 'order_list' %}?office=foobar&{{ request.GET.urlencode }}

Modify your settings to have request variable:

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP

TEMPLATE_CONTEXT_PROCESSORS = TCP + (
    'django.core.context_processors.request',
)
31
votes

Use urlencode if the argument is a variable

<a href="{% url 'myview' %}?office={{ some_var | urlencode }}">

or else special characters like spaces might break your URL.

Documentation: https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#urlencode

8
votes

First, a silly answer:

{% url my-view-name %}?office=foobar

A serious anwser: No, you can't. Django's URL resolver matches only the path part of the URL, thus the {% url %} tag can only reverse that part of URL.

1
votes

If your url (and the view) contains variable office then you can pass it like this:

{% url 'some-url-name' foobar %}

or like this, if you have more than one parameter:

{% url 'some-url-name' office='foobar' %}

Documentation: https://docs.djangoproject.com/en/3.1/ref/templates/builtins/#url

0
votes

Try this:

{% url 'myview' office=foobar %}

It worked for me. It basically does a reverse on that link and applies the given arguments.