Last active
October 11, 2016 05:27
-
-
Save corebreaker/d0f2c3ac886e8bbb6b70925c0035cbcc to your computer and use it in GitHub Desktop.
Templates Tags in Django 1.9.x as tools for list manipulations
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.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