OUJOOD.COM
La balise extends
L'héritage de templates est l'une des fonctionnalités les plus utiles de Django. L'idée est simple : on crée une page parente qui contient la structure commune à toutes les pages du site, et les pages enfants viennent compléter les zones prévues à cet effet, sans toucher au reste.La balise extends déclare qu'un template hérite d'un autre. Elle se place en toute première ligne du fichier enfant — avant tout autre contenu.
Syntaxe :
{% extends 'nom_template.html' %}
Le chemin du template parent est relatif au répertoire racine des templates. On peut aussi utiliser des chemins relatifs commençant par
./ ou ../. Voici un exemple de structure de répertoires :
dossier1/
template.html
page2.html
sous_dossier/
page3.html
page1.html
dossier2/
page4.html
Selon l'emplacement du template courant, voici comment référencer différents fichiers parents :
{% extends "template2.html" %}
{% extends "../template1.html" %}
{% extends "./sous_dossier/template3.html" %}
{% extends "../dossier2/template3.html" %}
Premier exemple : un espace réservé
L'héritage fonctionne grâce à la balise {% block %}. Dans le template parent, on place des blocs vides qui indiquent à Django où insérer le contenu des pages enfants. Chaque bloc porte un nom unique.1) La page parente :
Fichier page_parente.html 📋 Copier le code
<!DOCTYPE html>
<html>
<body>
<h1> Bienvenu </h1>
{% block monmessage %}
{% endblock %}
<p>
Jetez un coup d'œil aux deux templates pour voir à
quoi ils ressemblent, et à views.py pour voir la
référence au template enfant.
</p>
</body>
</html>
Fichier template.html 📋 Copier le code
{% extends 'page_parente.html' %}
{% block monmessage %}
<p>Cette page a une page parente</p>
{% endblock %}
Fichier views.py 📋 Copier le code
from django.http import HttpResponse
from django.template import loader
def testing(request):
template = loader.get_template('template.html')
return HttpResponse(template.render())
Dans la page parente
page_parente.html, on a placé un bloc vide nommé monmessage. C'est l'espace réservé où Django viendra injecter du contenu.Dans la page enfant
template.html, on déclare d'abord {% extends 'page_parente.html' %}, puis on remplit le bloc du même nom avec le contenu souhaité. Django récupère ce contenu et le place exactement là où le bloc est défini dans le parent.
Deuxième exemple : plusieurs espaces réservés
On peut multiplier les blocs dans une même page parente. Chacun a son propre nom et sera rempli indépendamment par la page enfant. Dans l'exemple suivant, on crée deux blocs : mon_titre pour le titre de la page, et ma_liste pour afficher la liste des membres depuis la base de données.1) La page parente :
Fichier page_parente.html 📋 Copier le code
<!DOCTYPE html>
<html>
<body>
{% block mon_titre %}
{% endblock %}
{% block ma_liste %}
{% endblock %}
<p>
Jetez un coup d'œil aux deux templates pour voir à
quoi ils ressemblent, et views.py pour voir la
référence au template enfant et comment la
variable des membres se présente.
</p>
</body>
</html>
Fichier template.html 📋 Copier le code
{% extends 'page_parente.html' %}
{% block mon_titre %}
<h1>Liste des membres</h1>
{% endblock %}
{% block ma_liste %}
<ul>
{% for x in membres %}
<li>{{ x.prenom }}</li>
{% endfor %}
</ul>
{% endblock %}
<p>Cette page a une page parente</p>
Fichier views.py 📋 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')
contenu = {
'membres': monmembres,
}
return HttpResponse(template.render(contenu, request))
Ce qui est affiché, ce qui est ignoré
Il y a une règle simple à retenir sur le contenu placé dans les blocs :Dans la page parente, tout ce qui se trouve à l'intérieur d'un bloc est ignoré au rendu — ces blocs sont des espaces vides en attente d'être remplis par les enfants. En revanche, tout ce qui est en dehors des blocs s'affiche normalement.
Dans la page enfant, c'est l'inverse : seul le contenu placé à l'intérieur des blocs est pris en compte et transmis au parent. Tout ce qui est écrit en dehors des blocs est ignoré par Django et n'apparaîtra pas dans la page finale.
Par carabde | Mis à jour le 01 juin 2026