logo oujood
🔍

Comment utiliser la boucle for dans les templates Django

La syntaxe reste proche de Python, avec quelques adaptations propres au langage de template Django.

OUJOOD.COM

Pour tester les exemples de ce tutoriel, nous utilisons l'application testes créée au début de cette section sur le langage de template Django.

La balise {% for %} dans les templates Django

La balise {% for %} sert à parcourir une séquence d'éléments : une liste, un dictionnaire ou un QuerySet issu d'un modèle. À chaque tour de boucle, l'élément courant est accessible via une variable de votre choix.

La syntaxe de base est la suivante :

{% for i in liste %}
    <!-- code à répéter pour chaque élément -->
{% endfor %}

Parcourir une liste simple

L'exemple le plus direct : afficher chaque élément d'une liste Python sous forme d'items HTML. Le template reçoit la liste via le contexte défini dans views.py.

  📋 Copier le code

<!DOCTYPE html>
<html>
<body>
<h1>Liste des fruits :</h1>
<ul>
{% for x in fruits %}
  <li>{{ x }}</li>
{% endfor %}
</ul>
<p>La variable fruits est définie dans views.py.</p>
</body>
</html>

  📋 Copier le code

from django.http import HttpResponse
from django.template import loader

def testing(request):
  template = loader.get_template('template.html')
  context = {
    'fruits': ['Orange', 'Banane', 'Cerise', 'Pomme', 'Avocat'],
  }
  return HttpResponse(template.render(context, request))

Parcourir un dictionnaire

Quand les données sont structurées en paires clé/valeur — comme ici une liste de voitures avec leur marque et leur année — la boucle for accède à chaque champ via la notation pointée x.marque, x.annee.

  📋 Copier le code

<!DOCTYPE html>
<html>
<body>
<h1>Marques de voitures françaises :</h1>
<dl>
{% for x in voitures %}
  <dt>Marque : {{ x.marque }}</dt>
  <dd>Année : {{ x.annee }}</dd>
{% endfor %}
</dl>
</body>
</html>

  📋 Copier le code

from django.http import HttpResponse
from django.template import loader

def testing(request):
  template = loader.get_template('template.html')
  context = {
    'voitures': [
      {'marque': 'BUGATTI',    'annee': '1909'},
      {'marque': 'CHRYSLER',   'annee': '1970-1979'},
      {'marque': 'CITROËN',    'annee': 'Depuis 1919'},
      {'marque': 'DS',         'annee': '2014'},
      {'marque': 'DELAHAYE',   'annee': '1935-1954'},
      {'marque': 'FACEL-VEGA', 'annee': '1954-1964'},
      {'marque': 'FORD',       'annee': '1916-1954'},
      {'marque': 'PANHARD',    'annee': '1890-1967'},
    ],
  }
  return HttpResponse(template.render(context, request))

Boucle sur des données issues d'un modèle

En pratique, les données viennent rarement d'une liste codée en dur. Elles proviennent d'une base de données, récupérées via un modèle Django. Le résultat d'une requête .all().values() renvoie un QuerySet — une collection d'objets dont la structure est identique à un dictionnaire. La boucle for dans le template s'utilise exactement de la même façon.

L'exemple ci-dessous affiche les membres du modèle créé dans le chapitre sur les modèles :

  📋 Copier le code

<!DOCTYPE html>
<html>
<body>
<h1>Liste des membres :</h1>
<table>
  <tr><th>Prénom</th><th>Nom</th><th>Email</th></tr>
  {% for x in membres %}
  <tr>
    <td>{{ x.prenom }}</td>
    <td>{{ x.nom }}</td>
    <td>{{ x.mail }}</td>
  </tr>
  {% endfor %}
</table>
</body>
</html>

  📋 Copier le code

from django.http import HttpResponse
from django.template import loader
from .models import Membres

def testing(request):
  monmembres = Membres.objects.all().values()
  template = loader.get_template('template.html')
  context = {
    'membres': monmembres,
  }
  return HttpResponse(template.render(context, request))

Le mot-clé reversed

Ajoutez reversed dans la balise for pour parcourir la liste à rebours, du dernier élément jusqu'au premier. Utile par exemple pour afficher les entrées les plus récentes en tête de liste, sans modifier la requête dans views.py.

{% for x in membres reversed %}
  <tr>
    <td>{{ x.prenom }}</td>
    <td>{{ x.nom }}</td>
    <td>{{ x.mail }}</td>
  </tr>
{% endfor %}

Le mot-clé empty

Le bloc {% empty %} s'exécute quand la liste passée à la boucle est vide ou inexistante. C'est une façon propre d'éviter un tableau vide sans condition {% if %} supplémentaire.

  📋 Copier le code

<!DOCTYPE html>
<html>
<body>
<h1>Liste des membres :</h1>
<ul>
{% for x in monobjet %}
  <li>{{ x }}</li>
{% empty %}
  <li>Aucun membre trouvé.</li>
{% endfor %}
</ul>
</body>
</html>

  📋 Copier le code

from django.http import HttpResponse
from django.template import loader
from .models import Membres

def testing(request):
  template = loader.get_template('template.html')
  context = {
    'monobjet': [], # liste vide : le bloc {% empty %} s'affiche
  }
  return HttpResponse(template.render(context, request))

Par carabde | Mis à jour le 21 mai 2026