logo oujood
🔍

Créer des template tags personnalisés dans Django

Les balises et filtres intégrés de Django couvrent la plupart des besoins, mais certaines logiques d'affichage répétées méritent leur propre tag. Ce chapitre explique comment créer des filtres personnalisés et des balises simples réutilisables dans tous vos templates.

OUJOOD.COM

Quand créer un tag personnalisé

Les filtres et balises intégrés de Django — {{ valeur|upper }}, {% if %}, {% for %} — couvrent la majorité des cas. Mais quand une logique d'affichage se répète dans plusieurs templates, la dupliquer est une mauvaise idée. Les template tags personnalisés permettent d'encapsuler cette logique en Python et de l'appeler comme n'importe quelle balise Django.

Structure du dossier templatetags

Django cherche les tags personnalisés dans un sous-dossier nommé templatetags à l'intérieur de chaque application. Ce dossier doit contenir un fichier __init__.py vide pour être reconnu comme un module Python.

  📋 Copier le code

membres/
    templatetags/
        __init__.py          # Fichier vide obligatoire
        membres_extras.py    # Vos filtres et tags
    templates/
    models.py
    views.py

Le nom du fichier est libre — c'est lui que vous passerez à {% load %} dans les templates.

Créer un filtre personnalisé

Un filtre transforme une valeur. Il s'applique avec le pipe | dans les templates : {{ valeur|mon_filtre }}. En Python, c'est une fonction qui reçoit la valeur et retourne la valeur transformée.

  📋 Copier le code

# membres/templatetags/membres_extras.py
from django import template

register = template.Library()

@register.filter
def initiales(valeur):
    # "Emil Refsnes" → "E.R."
    mots = valeur.split()
    return '.'.join(m[0].upper() for m in mots) + '.'

@register.filter
def tronquer(valeur, longueur):
    # Tronque un texte à N caractères avec "..."
    if len(valeur) <= longueur:
        return valeur
    return valeur[:longueur] + '...'

Pour l'utiliser dans un template, chargez le fichier avec {% load %} puis appliquez le filtre :

  📋 Copier le code

{% load membres_extras %}

<!-- Affiche "E.R." -->
<p>{{ membre.prenom_nom|initiales }}</p>

<!-- Tronque à 50 caractères -->
<p>{{ article.contenu|tronquer:50 }}</p>

Créer une balise simple avec simple_tag

Un simple_tag est une balise qui exécute du code Python et retourne une valeur. Contrairement aux filtres qui transforment une variable existante, il peut prendre des arguments libres et accéder au contexte du template.

  📋 Copier le code

from django import template
from django.utils import timezone

register = template.Library()

@register.simple_tag
def date_actuelle(format='%d/%m/%Y'):
    # Retourne la date du jour formatée
    return timezone.now().strftime(format)

@register.simple_tag
def nombre_membres():
    from membres.models import Membres
    return Membres.objects.count()

  📋 Copier le code

{% load membres_extras %}

<!-- Affiche la date du jour -->
<p>Mis à jour le {% date_actuelle %}</p>

<!-- Avec format personnalisé -->
<p>{% date_actuelle '%B %Y' %}</p>

<!-- Stocke le résultat dans une variable -->
{% date_actuelle as aujourd_hui %}
<p>Nous sommes le {{ aujourd_hui }}</p>

Créer une balise d'inclusion avec inclusion_tag

Un inclusion_tag rend un template partiel et l'insère dans la page. C'est le mécanisme idéal pour les composants réutilisables : menus, cartes, widgets — des morceaux de HTML qui ont besoin de données dynamiques.

  📋 Copier le code

@register.inclusion_tag('membres/carte_membre.html')
def carte_membre(membre_id):
    from membres.models import Membres
    membre = Membres.objects.get(id=membre_id)
    # Le dictionnaire retourné est le contexte du template partiel
    return {'membre': membre}

Le template partiel membres/templates/membres/carte_membre.html :

  📋 Copier le code

<div class="carte">
    <h3>{{ membre.prenom }} {{ membre.nom }}</h3>
    <p>{{ membre.mail }}</p>
</div>

  📋 Copier le code

{% load membres_extras %}

<!-- Affiche la carte du membre avec l'id 1 -->
{% carte_membre 1 %}

Remarque : après avoir créé ou modifié un fichier dans templatetags/, redémarrez le serveur de développement. Django ne recharge pas automatiquement ces fichiers lors des modifications.

Par carabde | Mis à jour le 05 mai 2025