Skip to content

Instantly share code, notes, and snippets.

@maddrum
Last active June 7, 2021 12:08
Show Gist options
  • Save maddrum/5c15e2da7684482c22aa5a031327f8dd to your computer and use it in GitHub Desktop.
Save maddrum/5c15e2da7684482c22aa5a031327f8dd to your computer and use it in GitHub Desktop.
Django template tags to update, remove or append url get parameter
from django import template
register = template.Library()
@register.simple_tag(takes_context=True)
def query_transform(context, **kwargs):
query = context.request.GET.copy()
for key, value in kwargs.items():
query[key] = value
return query.urlencode()
@register.simple_tag(takes_context=True)
def replace_url_get_parameter(context, base_url, get_parameter, value):
"""
Replaces all existing get parameters with the one with the given value.
Adds the given parameter if it does not exists.
"""
current = context.request.GET.copy()
if get_parameter in current:
current.pop(get_parameter)
current.update({get_parameter: value})
result = f'{base_url}?{current.urlencode()}'
return result
@register.simple_tag(takes_context=True)
def remove_url_get_parameters(context, base_url, get_parameters):
"""
Totally removes all specified get parameter/s
Could be a single parameter or multiple comma separated parameters
"""
current = context.request.GET.copy()
parameters_list = get_parameters.split(',')
for parameter in parameters_list:
if parameter in current:
current.pop(parameter)
result = f'{base_url}?{current.urlencode()}'
return result
@register.simple_tag(takes_context=True)
def append_url_get_parameter(context, base_url, get_parameter, value):
"""
Appends value to given get parameter
If it does not exist - creates it.
"""
current = context.request.GET.copy()
current.update({get_parameter: value})
result = f'{base_url}?{current.urlencode()}'
return result
@register.simple_tag(takes_context=True)
def toggle_url_get_parameter(context, base_url, get_parameter, value):
"""
If the given value of given parameter is in parameter list - removes it.
Else appends it.
"""
value_str = str(value)
current = context.request.GET.copy()
params_list = []
if get_parameter in current:
params_list = current.pop(get_parameter)
if value_str in params_list:
params_list = [item for item in params_list if item != value_str]
else:
params_list.append(value_str)
for parameter_value in params_list:
current.update({get_parameter: parameter_value})
if current:
result = f'{base_url}?{current.urlencode()}'
else:
result = f'{base_url}'
return result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment