OUJOOD.COM
La balise extends
La balise extends vous permet d'ajouter un template parent pour le template actuel.Cela signifie que vous pouvez avoir une page principale qui agit comme un parent pour toutes les autres pages :
En d’autre terme la page enfant sera une extension de la page parente, pour cela en utilise la balise extends dont la syntaxe est comme suit :
Syntaxe:
{% extends 'nom_templat.html' %}
Normalement, le nom du template à inclure est relatif au répertoire racine du template courant. Un argument de type chaîne peut également être un chemin relatif commençant par ./ ou ../. Par exemple, supposez la structure de répertoire suivante :
dossier1/ template.html page2.html sous_dossier/ page3.html page1.html dossier2/ page4.html
Pour inclure template1, template2 et template3 dans notre template on aura :
{% extends "template2.html" %}
{% extends "../template1.html" %}
{% extends "./sous_dossier/template3.html" %}
{% extends "../ dossier2/template3.html" %}
Exemple : 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>2) la page enfant :
Fichier template.html 📋 Copier le code
{% extends 'page_parente.html' %} {% block monmessage %} <p>Cette page a une page parente</p> {% endblock %}3) La page views
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())Explication : On place des espaces réservés dans le template parent, qui indiquent à Django où placer tel ou tel contenu.
Django utilise la balise {% block %} pour créer ces espaces.
Dans notre exemple :
1- Dans la page parente 'page_parente.html', nous avons placé une balise block vide avec un argument 'monmessage', c'est dans cet espace que sera inséré le contenu de la page enfant, que django va chercher dans la page enfant 'template.html'.
2- Dans la page enfant, nous avons placé le contenu désiré dans une balise block qui a le même argument 'monmessage', alors django va prendre ce contenu et le placer dans l'espace qui lui est réservé dans la page parente.
Voici un autre exemple avec deux espaces :
- un espace mon_titre pour récupérer le titre.
- et un autre espace ma_liste pour récupérer la luiste des membres.
Dans cet exemple nous utilisons la base de données membres créée dans les chapitres précédents.
Exemple : 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 enfantet comment la variable des membres se présente. </p> </body> </html>2) la page enfant :
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>3) La page views
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))Une dernière chose à savoir est que si vous placer du contenu dans la balise block de la pages parentes, il ne sera ignoré et donc ne sera pas affiché, parce que dans cette page les balises block sont toujours sensées être vide.
Mais tout ce que vous mettez en dehors de ces balises sera affiché.
Par contre dans les pages enfants c’est l’inverse.
C'est-à-dire que tout ce que vous mettez dans les balises block de la page enfant sera mis dans les balises du même nom de la page parente. Et au contraire tout ce qui est à l’extérieur des balises block sera ignoré par django et donc non affiché.