web-dev-qa-db-ja.com

Jinja2テンプレートにHTMLファイルを含めるにはどうすればよいですか?

Jinjaテンプレートを使用するサーバーにFlaskマイクロフレームワークを使用しています。

template.htmlchild1.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にはそのためのより良いツールがあると思います。

注:上記のコードは正常に動作していない可能性があります。問題を説明するために書きました。

64
quapka

Jinja2 {% include %} ディレクティブを使用します。

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

これには、正しいコンテンツファイルのコンテンツが含まれます。

139
msvalkon

include ステートメントを使用できます。

15
jarandaf