OUJOOD.COM
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.
<!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>
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.
<!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>
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 :
<!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>
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.
<!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>
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