Last active
June 7, 2021 12:08
-
-
Save maddrum/5c15e2da7684482c22aa5a031327f8dd to your computer and use it in GitHub Desktop.
Django template tags to update, remove or append url get parameter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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