Home > Django > Django: template custom_filter

Django: template custom_filter

9 Novembre 2016

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 }}
Categorie:Django Tag:
I commenti sono chiusi.