Apprendre l'utilisation des templatetags

a marqué ce sujet comme résolu.

Bonsoir,

J’essaie de me renseigner dans mon coin sur la création d’un filtre avec les templatetags. Or, je n’arrive pas vraiment à comprendre comment faire. L’objectif est gérer la différente de taille des avatars Gravatar entre ceux affichés sur le profil et ceux affichés sur le forum. Vous trouverez ici la PR.

J’ai lu cette page de la documentation de Django ainsi que le fichier feminize.py.

J’imagine qu’il y a plein d’erreurs dans ce que j’ai fait mais voici ma tentative :

from django import template

register = template.Library()

@register.filter(id="d=identicon'.format(md5(self.user.email.lower().encode('utf-8')).hexdigest())")
def gravatar_defaultSize(url):
    return url + id

def gravatar_profileSize(url, size=200):
    return url + 's=' + 200 + "&" + id

En fait, ce dont j’ai besoin est une meilleur compréhension de la structure des templatetages et de leur utilisation ailleurs dans le code.

Tu as eu une réponse sur Discord ?

Je me risque à te répondre dans le cas échéant : La ligne 5 (registre.filter) me semble bien longue, l’argument de filter est le nom de ta fonction à utiliser

Au début de cette fonction tu peux calculer le hash à utiliser dans l’URL et retourner la valeur voulue.

Tu as eu une réponse sur Discord ?

A-312

Non, c’est pour ça que j’ai posté ici ;) .

Je me risque à te répondre dans le cas échéant : La ligne 5 (registre.filter) me semble bien longue, l’argument de filter est le nom de ta fonction à utiliser

Au début de cette fonction tu peux calculer le hash à utiliser dans l’URL et retourner la valeur voulue.

A-312

Je pense réellement ne pas comprendre comment ça fonctionne. Je pensais que l’argument était une valeur par défaut dans tous les cas. Je suis perdu :euh:

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 nn 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 }}
{# Sortie : LE THÉ #}

{{ "Le thé c'est la vie" | upper_and_cut }}
{# Sortie : LE #}

On peut aussi donner un paramètre name au décorateur pour utiliser autre chose que le nom de la fonction comme nom du filtre côté gabarit.

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 }}
{# Sortie (exemple) : https://www.gravatar.com/avatar/a452b7d210aca536bfe1e90f203075c9?d=identicon&s=120 #}
+0 -0

Merci pour l’explication. Je comprends beaucoup mieux pour le coup. Je ne sais pas sur quoi je bloquais mais ça me paraît bien plus simple maintenant ^^ !

Pour le ticket que je souhaite traiter, il faut modifier la taille de l’avatar Gravatar seulement sur la page du profil. Or, il me semble que l’avatar est récupéré au même endroit, quelque soit la page à afficher. Faut-il modifier la structure globale ou existe-t-il un moyen de récupérer une taille différente selon la page où l’on affiche l’image ?

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte