Skip to content

Instantly share code, notes, and snippets.

@corebreaker
Last active October 11, 2016 05:27
Show Gist options
  • Save corebreaker/d0f2c3ac886e8bbb6b70925c0035cbcc to your computer and use it in GitHub Desktop.
Save corebreaker/d0f2c3ac886e8bbb6b70925c0035cbcc to your computer and use it in GitHub Desktop.
Templates Tags in Django 1.9.x as tools for list manipulations
from django.template.library import Library
register = Library()
@register.filter
def split(s, sep= None):
'''
Example:
{# For details on 'assign' tag, see https://gist.github.com/corebreaker/6d94b7d06f7ed9d8bfc4985b094bf6d4 #}
{% assign 'A,B,C' as my_string %}
<ul>
{% for i in my_string|split:',' }}
<li>{{ i }}</li>
{% endfor %}
</ul>
Result:
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
</ul>
'''
return (s or '').split(sep or ' ')
@register.filter
def inlist(l, value):
return (value or '') in (l or [])
@register.filter
def list_filter(lst, attr_name):
attr_name = attr_name or ''
def get_attr(val):
if hasattr(val, '__getitem__') and callable(val.__getitem__):
try:
return val[attr_name]
except:
pass
return getattr(val, attr_name, False)
return [elt for elt in (lst or []) if get_attr(elt)]
@register.filter
def find_first(lst, attr_name):
attr_name = attr_name or ''
def get_attr(val):
if hasattr(val, '__getitem__') and callable(val.__getitem__):
try:
return val[attr_name]
except:
pass
return getattr(val, attr_name, False)
res, idx = -1, 0
for elt in (lst or []):
if get_attr(elt):
res = idx
break
idx += 1
return res
@register.simple_tag(name= 'make-list')
def make_list(*values):
return list(values)
@register.simple_tag(name= 'list-values')
def list_values(*values):
'''
Examples:
{% values 'A' 'B' 'C' as a_var %}
{% values 1 'A' this as my_list %}
'values' statement makes better and easier that old way to make lists:
{{ 'ABC'|make_list }}
'''
return values
@register.simple_tag(name= 'make-range')
def make_range(start_stop, stop= None, step= None):
'''
Examples:
{% range 10 as list1 %}
{% for i in list1 %}
{{ i }}
{% endfor %}
{% range 0 10 2 as list2 %}
{% for i in list2 %}
{{ i }}
{% endfor %}
'''
try:
step = int(step or 1)
except ValueError:
step = 1
start_stop = int(start_stop or 0)
if stop is None:
if abs(step) > 1:
range(0, start_stop, step)
return range(start_stop)
else:
stop = int(stop or 0)
return range(start_stop, stop, step)
@register.simple_tag(name= 'concat-list')
def concat_lists(*lists):
'''
Common operator for lists, concatenate lists passed as parameters:
{% concatlists list1 list2 list3 as new_list %}
'''
res = []
for l in lists:
res += list(l or [])
return res
@register.filter('embed-list')
def embed_list(val, prefix_suffix):
'''
{# For details on 'assign' tag, see https://gist.github.com/corebreaker/6d94b7d06f7ed9d8bfc4985b094bf6d4 #}
{% assign 'A,B,C' as my_old_string %}
{{ my_old_string |split:',' |embedlist:'[,]' |join ', ' }}
Equals to:
[{{ my_old_string |split:',' |join:'], [' }}]
'''
prefix, suffix = str(prefix_suffix).split(',', 1)
return [(prefix + v + suffix) for v in val]
@register.simple_tag(name= 'make-set')
def make_set(*values):
return set(values)
@register.simple_tag(name= 'make-set')
def set_add(set_value, *values):
set_value.add(*values)
return ''
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment