Modèles et héritage

Une des plus puissantes fonctionnalités de Flask+Jinja est l’héritage de modèle : un modèle de base sert de squelette à des modèles enfant.

Ceci est très utile pour un site qui doit comporter plusieurs pages ayant des éléments en commun : en-tête, pied de page, menu de navigation, …

Exemple de structure simple

Le modèle de base

Il contient la structure commune à toutes les pages du site.

  • Des modèles, sous forme de fichiers HTML, y sont intégrés avec la déclaration {% include monFichier.html %} ,
  • Des blocs HTML y sont intégré avec la déclaration {% block monBloc %}{% endblock %}.

 

Exemple avec un fichier modèle base.html :

<!DOCTYPE html >
<html lang="fr">
   {% block head %}
   <head>
      <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>{% block title %}{% endblock %}</title>
   </head>
   {% endblock %}
<body>
   {% include "header.html" %} 
   <div class="interieur"> 
   {% block content %}{%- endblock %} 
   </div> 
   {% include "footer.html" %}
</body>
</html>

 

Ainsi les modèles « enfant » sont des extensions du modèle de base, grâce à la déclaration {% extends "base.html" %}.

Exemple avec le fichier maPage.html :

{% extends "base.html" %}
{% block head %}
  {{ super() }}
  <style type="text/css">
    .interieur{ color: #336699; }
  </style>
{% endblock %}
{% block title %}Titre de la page{% endblock %}
{% block content %}  
<p> Bonjour ! </p>
{% endblock %}

Et les fichiers header.html :

<div> Mon plus beau site Web !</div>

et footer.html :

<a href="https://info.blaisepascal.fr">Visitez info.blaisepascal.fr !</a> 

 

Du point de vue du navigateur Web, le rendu final de la page sera :

<!DOCTYPE html >
<html lang="fr">
   <head>
      <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Titre de la page</title>
      <style type="text/css">
        .interieur{ color: #336699; }
      </style>
   </head>
<body>
   <div> Mon plus beau site Web !</div>
   <div class="interieur"> 
     <p> Bonjour ! </p>
   </div> 
   <a href="https://info.blaisepascal.fr">Visitez info.blaisepascal.fr !</a>
</body>
</html>

Quelques explications :

  • Coté modèle de base, on déclare des blocs avec {% block monBloc %}{% endblock %}
  • Un bloc peut être initialement vide, ou pas : s’il n’est pas vide à la déclaration (le bloc head par exemple) :
    • son contenu sera remplacé par celui de la déclaration {% block monBloc %}...{% endblock %} coté modèle enfant
    • ou bien complété par celui du modèle enfant lorsqu’il est précédé de {{ super() }}
  • Les variables déclarées dans le modèle de base sont utilisables dans les modèles enfant.

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *