oujood.com

La balise extends pour les templates Django

Dans cet article, nous allons voir comment utiliser la balise extends dans les templates en Django. La balise extends est utilisée pour l'héritage des templates.
La balise extends permet à des pages d’hériter d’une page parente, sans avoir à écrire le même code encor et encor.

chercher |

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é.

Voir aussi nos tutoriel :

svg polygone

Dessin d’un polygone en SVG

La pagination avec PHP et MySQL

Ce tutoriel va vous montrer comment sélectionner des données dans une base de données MySQL, les répartir sur plusieurs pages, pour les afficher page par page à l'aide de numéros de page

Balise élément de lite dt

Définit un terme (un élément) dans une liste de définition