web-dev-qa-db-fra.com

Comment inclure un fichier HTML dans un modèle Jinja2?

J'utilise Flask micro-framework pour mon serveur qui utilise des modèles Jinja.

J'ai un parent template.html Et des modèles d'enfants appelés child1.html Et child2.html, Certains de ces modèles d'enfants sont de très gros fichiers HTML et j'aimerais les scinder en quelque sorte pour une meilleure lucidité. sur mon travail.

Contenu de mon script main.py:

from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/')
@app.route('/<task>')
def home(task=''):
  return render_template('child1.html', task=task)

app.run()

Le template.html Simplifié:

<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <div class="container">
      {% block content %}{% endblock %}
    </div>
  </body>
</html>

La magie est dans child1.html:

{% extends 'template.html' %}
{% block content %}
  {% if task == 'content1' %}
    <!-- include content1.html -->
  {% endif %}
  {% if task == 'content2' %}
    <!-- include content2.html -->
  {% endif %}
{% endblock %}

Au lieu des commentaires:

<!-- include content1.html -->

J'ai beaucoup de texte HTML, et il est très difficile de suivre les changements et de ne pas commettre d'erreurs, qui sont alors assez difficiles à trouver et à corriger.

J'aimerais simplement charger le content1.html Au lieu de tout écrire dans child1.html.

Je suis tombé sur cette question , mais j'ai eu du mal à la mettre en œuvre.

Je pense que Jinja2 pourrait avoir un meilleur outil pour cela.

REMARQUE: Le code ci-dessus peut ne pas fonctionner correctement, je viens de l'écrire pour illustrer le problème.

64
quapka

Utilisez le jinja2 {% include %} directive.

{% extends 'template.html' %}
{% block content %}
    {% if task == 'content1' %}
        {% include 'content1.html' %}
    {% endif %}
    {% if task == 'content2' %}
        {% include 'content2.html' %}
    {% endif %}
{% endblock %}

Cela inclura le contenu du fichier de contenu correct.

139
msvalkon

Vous pouvez utiliser l'instruction include .

15
jarandaf