Je ne comprends pas trop ce à quoi servent concrètement ces deux fonctions — j’y reconnais des éléments de gravatar, mais leur implémentation semble bien étrange par rapport à l’usage que l’on en ferait dans le cadre d’un filtre Django. D’autant plus que pour ce que tu veux faire, une seule fonction suffit.
Reprenons depuis le début.
Là tu sembles vouloir faire un filtre. Donc quelque chose qui s’utilise, par exemple, comme ceci dans le gabarit.
{% load tes_tpltags %}
[...]
{{ var | gravatar:120 }}
Pour ça, il faut dire à Django quoi faire s’il rencontre un tel filtre dans ce code. Concrètement, il va appeler une fonction que tu lui donnes, en lui passant, selon les cas, un ou deux arguments :
- le premier est la valeur de ce à quoi on applique le filtre (ici, ce serait la valeur de la variable
var
) ;
- le second, s’il y en a un, est la valeur passée en argument au filtre (ici, ce serait
120
, mais si le filtre n’a pas d’argument, rien n’est passé).
Le décorateur sert simplement à dire à Django : cette fonction, elle traite ce filtre. Par exemple, si on veut écrire un filtre qui met tout en majuscules et qui coupe après n lettres (valeur donnée en argument), on pourrait écrire quelque chose comme ça (avec une valeur par défaut pour l’argument) :
@register.filter
def upper_and_cut(value, max_len=2):
return value.upper()[:max_len]
Ce qu’on utiliserait comme ça :
{% load ton_tpltag %}
{{ "Le thé c'est la vie" | upper_and_cut:6 }}
{{ "Le thé c'est la vie" | upper_and_cut }}
Dans ton cas, tu veux filtrer sur une adresse de courriel et recevoir la taille comme argument. Il te faut donc déclarer le filtre comme ceci, supposant qu’on veuille le nommer gravatar
, comme la fonction :
@register.filter
def gravatar(email, avatar_size=200):
pass
Ensuite, il faut faire le traitement dans la fonction pour récupérer la bonne URL (ce que, sauf erreur, tu faisais dans le décorateur).
Une façon d’implémenter le filtre — non-testée ! Mais elle peut servir d’inspiration…
from django import template
register = template.Library()
@register.filter
def gravatar(email, avatar_size=200):
"""
Filtre Django transformant une adresse de courriel en avatar Gravatar
de taille donnée en argument (par défaut 200px).
"""
hash = md5(email.strip().lower().encode('utf-8')).hexdigest()
return f'https://www.gravatar.com/avatar/{hash}?d=identicon&s={avatar_size}'
Et alors, le filtre devrait fonctionner.
{% load ton_tpltag %}
{{ user.email | gravatar:120 }}