Как включить HTML-файл в шаблон Jinja2?

85

Я использую микросхему Flask для своего сервера, который использует шаблоны Jinja.

У меня есть родительский template.htmlи несколько дочерних шаблонов, которые называются, child1.htmlи child2.htmlнекоторые из этих дочерних шаблонов представляют собой довольно большие HTML-файлы, и я хотел бы как-то разделить их для большей ясности в моей работе.

Содержание моего 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()

Упрощенное template.html:

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

Магия в child1.html:

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

Вместо комментариев:

<!-- include content1.html -->

У меня много html-текста, и очень сложно отслеживать изменения и не допускать ошибок, которые потом довольно сложно найти и исправить.

Я хотел бы просто загрузить content1.htmlвместо того, чтобы писать все это child1.html.

Я столкнулся с этим вопросом , но у меня возникли проблемы с его реализацией.

Я думаю, что у Jinja2 есть для этого лучший инструмент.

ПРИМЕЧАНИЕ. Приведенный выше код может работать некорректно, я просто написал его, чтобы проиллюстрировать проблему.

квапка
источник

Ответы:

184

Используйте {% include %}директиву jinja2 .

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

Это будет включать содержимое из правильного файла содержимого.

мсвалкон
источник