Guide des balises et filtres de base dans les templates Django

Django propose des balises et des filtres puissants pour manipuler l'affichage des données dans les templates. Voici un aperçu des plus courantes.

Balise ifLa balise {% if ... %} permet d'afficher conditionnellement du contenu. Elle peut tester la vérité d'une variable.

{% if utilisateur_connecte %}
    <p>Bienvenue !</p>
{% endif %}

{% if utilisateur_connecte %}
    <p>Bienvenue !</p>
{% else %}
    <p>Veuillez vous connecter.</p>
{% endif %}

Il est possible d'utiliser les opérateurs logiques and, or et not pour des conditions plus complexes.

{% if liste_articles and utilisateur_admin %}
    <p>Afficher tous les articles pour l'administrateur.</p>
{% endif %}

{% if not liste_articles %}
    <p>Aucun article disponible.</p>
{% endif %}

{% if liste_articles or categorie_speciale %}
    <p>Il y a des articles ou une catégorie spéciale.</p>
{% endif %}

L'utilisation simultanée et ambiguë de and et or dans une seule instruction if n'est pas autorisée. Il faut alors imbriquer les balises if ou structurer la logique en amont dans la vue.

{# Mauvais exemple (ambigu) #}
{% if article_disponible and categorie_a or article_b %}
{# Bon exemple avec imbrication #}
{% if article_disponible %}
    {% if categorie_a or article_b %}
        <p>Article disponible, avec catégorie A ou article B.</p>
    {% endif %}
{% endif %}

Il n'existe pas de balise elif directe. L'équivalent s'obtient par imbrication de balises if.

{% if status_code == 200 %}
    <p>Succès.</p>
{% else %}
    <p>Erreur.</p>
    {% if status_code == 404 %}
        <p>Page non trouvée.</p>
    {% endif %}
{% endif %}

Chaque balise {% if %} doit avoir une balise correspondante {% endif %}.

Balise forLa balise {% for ... in ... %} permet d'itérer sur une séquence (liste, tuple, queryset, etc.).

 {% for utilisateur in liste\_utilisateurs %} - {{ utilisateur.nom }}
 {% endfor %} 

Il est posisble d'inverser l'ordre d'itération avec le mot-clé reversed.

{% for produit in produits reversed %}
    <p>{{ produit.nom }}</p>
{% endfor %}

Les boucles peuvent être imbriquées pour parcourir des structures de données complexes.

{% for commande in commandes %}
    <h2>Commande #{{ commande.id }}</h2>
     {% for article in commande.articles %} - {{ article.nom }} - Quantité : {{ article.quantite }}
 {% endfor %} 
{% endfor %}

Pour gérer le cas où la séquence est vide, on peut utiliser une condition {% if %} ou la balise optionnelle {% empty %}.

{# Avec if #}
{% if liste_produits %}
    {% for produit in liste_produits %}
        <p>{{ produit.nom }}</p>
    {% endfor %}
{% else %}
    <p>Aucun produit en stock.</p>
{% endif %}

{# Avec empty #}
{% for produit in liste_produits %}
    <p>{{ produit.nom }}</p>
{% empty %}
    <p>Aucun produit en stock.</p>
{% endfor %}

Les instructions break et continue ne sont pas supportées nativement dans les boucles for de Django. Il faut pré-traiter les données dans la vue. Dans une boucle {% for %}, la variable spéciale forloop offre des informations utiles :

  • forloop.counter : Le nombre d'itérations effectuées (commence à 1).
  • forloop.counter0 : Idem, mais commence à 0.
  • forloop.revcounter : Le nombre d'itérations restantes (commence à la taille de la liste).
  • forloop.revcounter0 : Idem, mais commence à taille de la liste - 1.
  • forloop.first : Booléen, vrai si c'est la première itération.
  • forloop.last : Booléen, vrai si c'est la dernière itération.

Balises ifequal et ifnotequalCes balises comparent deux valeurs. {% ifequal ... %} affiche le contenu si les valeurs sont identiques, {% ifnotequal ... %} si elles sont différentes.

{% ifequal section 'accueil' %}
    <h1>Page d'accueil</h1>
{% endifequal %}

{% ifnotequal user.role 'invité' %}
    <p>Contenu réservé aux membres.</p>
{% endifnotequal %}

Elles supportent également l'option {% else %}.

{% ifequal langue 'fr' %}
    <p>Bonjour !</p>
{% else %}
    <p>Hello !</p>
{% endifequal %}

Les comparaisons sont possibles avec des chaînes de caractères, des nombres entiers et des nombres flottants. Les listes, dictionnaires et booléens ne peuvent pas être utilisés directement come arguments.

{# Valides #}
{% ifequal compteur 10 %}
{% ifequal prix 99.99 %}
{% ifequal nom 'Django' %}
{% ifequal statut "actif" %}

{# Invalides (à tester autrement, par exemple avec {% if %} et la logique dans la vue) #}
{% ifequal est_valide True %}
{% ifequal ma_liste [1, 2] %}
{% ifequal mon_dict {'cle': 'valeur'} %}

Commentaires Pour les commentaires sur une seule ligne, utilisez {# ... #}. Pour des commentaires multi-lignes, utilisez {% comment %} ... {% endcomment %}.

Filtres Les filtres permettent de transformer la valeur d'une variable avant son affichage. Ils sont appliqués avec le symbole pipe |.

{{ texte|lower }} {# Convertit en minuscules #}
{{ nombre|floatformat:2 }} {# Formate en nombre décimal avec 2 chiffres après la virgule #}
{{ date_publication|date:"d/m/Y" }} {# Formate une date #}

Il est possible de chaîner plusieurs filtres.

{{ titre_article|upper|truncatewords:10 }} {# Convertit en majuscules puis tronque à 10 mots #}

Étiquettes: Django templates HTML Python web development

Publié le 3 juin à 23h14