Django: template custom_filter
Per elaborare una variabile all’interno di una template di django,
è possibile utilizzare custom_filter.
Per prima cosa creare all’interno della directory myapp,
una sottodirectory ‘templatetags’, con all’interno un file vuoto __init__.py
e un file app_filters.py.
All’interno del file app_filters.py:
# noinspection PyUnresolvedReferences from django import template from django.utils.safestring import mark_safe register = template.Library() @register.filter(name='pts_filter') def pts_filter(value): if value: if float(value) <= 60: color = 'e60000' elif 60 < float(value) <= 72: color = 'cc66ff' else: color = '009933' new_string = '<b><font color="#%s">%s</font></b>' % (color, value) return mark_safe(new_string) else: return value
Nella template i filters vanno caricati all’inizio con la voce:
{% load app_filters %}
mentre il filtro verrà chiamato con la sintassi ‘value|filter:
{{ value|pts_filter }}
il valore ‘value’ viene passato come argomento alla funzione pts_filter()
che ritorna lo stesso valore dopo averlo modificato.
E’ assolutamente necessario ritornare il valore con mark_safe.
Qualora dovessimo anche passare un argomento al filter si userà la sintassi
tag|filter:arg ad esempio:
<b>player avg</b>: {{ player|get_avg:player.code}}
dove il filter sarà:
@register.filter(name='get_avg') def get_avg(player, code): obj_player = Player.objects.filter(name=player, code=code).first() values = [e.value for e in Evaluation.objects.filter(player=obj_player).all() if e.value > 0.0 ] return float(sum(values))/len(values)
Le template di django non sono completamente duttili ma è possibile creare dei tag specifici
che compiano operazioni e ritornino determinate cose.
Ad esempio filtrare queryset secondo determinati argomenti:
@register.assignment_tag def filter_iterable(iterable, value): return iterable.filter(arg=value)
nella template sarà richiamato così:
{% filter_iterable iterable day as f_iterable %} {% for item in f_iterable %} {{ item.arg1 }} {{ item.arg2 }}
Commenti recenti