130๐
To capture the QUERY_PARAMS that were part of the request, you reference the dict that contains those parameters (request.GET
) and urlencode them so they are acceptable as part of an href. request.GET.urlencode
returns a string that looks like ds=&date_published__year=2008
which you can put into a link on the page like so:
<a href="sameLink/?{{ request.GET.urlencode }}">
23๐
If you register a templatetag like follows:
@register.simple_tag
def query_transform(request, **kwargs):
updated = request.GET.copy()
updated.update(kwargs)
return updated.urlencode()
you can modify the query string in your template:
<a href="{% url 'view_name' %}?{% query_transform request a=5 b=6 %}">
This will preserve anything already in the query string and just update the keys that you specify.
- [Django]-Django โ how to unit test a post request using request.FILES
- [Django]-How to automate createsuperuser on django?
- [Django]-How to handle request.GET with multiple variables for the same parameter in Django
22๐
I found that @Michaelโs answer didnโt quite work when you wanted to update an existing query parameter.
The following worked for me:
@register.simple_tag
def query_transform(request, **kwargs):
updated = request.GET.copy()
for k, v in kwargs.items():
updated[k] = v
return updated.urlencode()
- [Django]-How to resize an ImageField image before saving it in python Django model
- [Django]-Django urls without a trailing slash do not redirect
- [Django]-Filter Queryset on empty ImageField
7๐
Following on from @Prydie (thank you!) I wanted to do the same, but in Python 3 & Django 1.10, with the addition of being able to strip querystring keys as well as modify them. To that end, I use this:
@register.simple_tag
def query_transform(request, **kwargs):
updated = request.GET.copy()
for k, v in kwargs.items():
if v is not None:
updated[k] = v
else:
updated.pop(k, 0) # Remove or return 0 - aka, delete safely this key
return updated.urlencode()
The python 3 bit being kwargs.items()
over .iteritems()
- [Django]-Best practices for adding .gitignore file for Python projects?
- [Django]-Django set field value after a form is initialized
- [Django]-Can I Make a foreignKey to same model in django?
7๐
Based on @Prydieโs solution (which itself uses @Michaelโs), I constructed the tag to return the complete URL instead of just the parameter string.
My myproject/template_tags.py
from django import template
register = template.Library()
# https://stackoverflow.com/a/24658162/2689986
@register.simple_tag
def add_query_params(request, **kwargs):
"""
Takes a request and generates URL with given kwargs as query parameters
e.g.
1. {% add_query_params request key=value %} with request.path=='/ask/'
=> '/ask/?key=value'
2. {% add_query_params request page=2 %} with request.path=='/ask/?key=value'
=> '/ask/?key=value&page=2'
3. {% add_query_params request page=5 %} with request.path=='/ask/?page=2'
=> '/ask/?page=5'
"""
updated = request.GET.copy()
for k, v in kwargs.items():
updated[k] = v
return request.build_absolute_uri('?'+updated.urlencode())
My settings.py
TEMPLATES = [
{
...
'OPTIONS': {
...
# loads custom template tags
'libraries': {
'mytags': 'config.template_tags',
}
},
},
]
Sample usage in templates:
{% load mytags %}
<a href="{% add_query_params request page=2 %}">
Tested with Python3.6 in Django1.11.10
- [Django]-Using Django auth UserAdmin for a custom user model
- [Django]-Fastest way to get the first object from a queryset in django?
- [Django]-How to get GET request values in Django?
5๐
Informed by other answers but not needing the request
passed in and only updates existing parameters.
@register.simple_tag(takes_context=True)
def querystring(context, **kwargs):
"""
Creates a URL (containing only the querystring [including "?"]) derived
from the current URL's querystring, by updating it with the provided
keyword arguments.
Example (imagine URL is ``/abc/?gender=male&name=Tim``)::
{% querystring "name"="Diego" "age"=20 %}
?name=Diego&gender=male&age=20
"""
request = context['request']
updated = request.GET.copy()
for k, v in kwargs.items(): # have to iterate over and not use .update as it's a QueryDict not a dict
updated[k] = v
return '?{}'.format(updated.urlencode()) if updated else ''
- [Django]-Django โ how to detect test environment (check / determine if tests are being run)
- [Django]-Django gives Bad Request (400) when DEBUG = False
- [Django]-Django Admin: Using a custom widget for only one model field
0๐
Just a workaround if you donโt want loops or string concatenations.
String representation of url is something like '<WSGIRequest: GET \'our_url\'>'
So if you want our_url
, you just need to use regex for it.
our_url = re.search(r'\/.*(?=\'>)', str(request)).group()
- [Django]-Extend base.html problem
- [Django]-Create a field whose value is a calculation of other fields' values
- [Django]-How to resize an ImageField image before saving it in python Django model