Jak dołączyć plik HTML do szablonu Jinja2?

85

Używam mikro-frameworka Flask dla mojego serwera, który używa szablonów Jinja.

Mam template.htmlszablony dla rodziców i dzieci o nazwie, child1.htmla child2.htmlniektóre z tych szablonów dla dzieci są dość dużymi plikami HTML i chciałbym je jakoś podzielić, aby uzyskać lepszą przejrzystość w mojej pracy.

Zawartość mojego main.pyskryptu:

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()

Uproszczone template.html:

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

Magia tkwi w child1.html:

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

Zamiast komentarzy:

<!-- include content1.html -->

Mam dużo tekstu HTML i bardzo trudno jest śledzić zmiany i nie popełniać błędów, które są wtedy dość trudne do znalezienia i poprawienia.

Chciałbym po prostu załadować, content1.htmlzamiast pisać to wszystko child1.html.

Natknąłem się na to pytanie , ale miałem problemy z jego wdrożeniem.

Myślę, że Jinja2 może mieć do tego lepsze narzędzie.

UWAGA: Powyższy kod może nie działać poprawnie, napisałem go tylko, aby zilustrować problem.

quapka
źródło

Odpowiedzi:

184

Użyj {% include %}dyrektywy jinja2 .

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

Obejmuje to treść z prawidłowego pliku zawartości.

msvalkon
źródło
17

Możesz użyć instrukcji include .

jarandaf
źródło