web-dev-qa-db-ja.com

Jinja2での複数レベルのテンプレート継承?

私はトレードでhtml/cssを行っており、テンプレートデザイナーとしてDjangoプロジェクトに取り組んでいます。現在、Jinja2を使用するサイトで作業しています。約2週間。ドキュメントを読んだところ、Jinja2は複数レベルのテンプレート継承をサポートしていないことがわかりました。

{% extends "foo" %}

レンダリングごと。これはDjangoで実行できると確信しています。これは、基本テンプレートを指定し、それに基づいて3つまたは4つのテンプレートを指定し、それらの基本テンプレートを使用してページの内容を構築できるため、強力です。継承のポイントではないので、抽象化する力が増すので、本当にユニークなコードをいじるだけですか?

いずれにせよ、私はここで何をすべきかわかりません。 Djangoテンプレートを使用した場合と同じように機能する方法があるかどうかはわかりません。どちらの場合も、正確には専門家ではありませんDjangoまたはJinja(2)ですが、必要な情報を提供できます。

25
Rey

ドキュメントの言い方では、継承(n)レベルの深さをサポートしていないように見えました。

Python Jinjaは多重継承をサポートしていません。したがって、レンダリングごとに呼び出される拡張タグは1つだけです。

テンプレートごとに1つ拡張するというのが単なるルールだとは知りませんでした。jinjaircチャネルの助けを借りて、今ではわかりました。

29
Rey

Jinja2を使用して複数レベルのテンプレートを作成するための最良の方法の1つは、ベーステンプレートとして「include」を使用することです。「base_layout.html

<!DOCTYPE html>
<title>Base Layout</title>
<div>
  <h1>Base</h1>
  .... // write your code here
  {% block body %}{% endblock %}
</div>

次に、 'base_layoutを拡張する' child_layout.html 'が必要です。

{% include "base_layout.html" %}
  <div>
  ... // write your code here
  </div>
{% block body %}{% endblock %}

これで、ページは 'child_layout.html'を拡張でき、base_layout.htmlchild_layout.htmlの両方になります。

{% extends "child_layout.html" %}
{% block body %}
  ...// write your code here
{% endblock %}
27
Toni

これを試してみてください。@ Ixmanswerのおかげでこの作業ができます。

base.html

<html xmlns="http://www.w3.org/1999/xhtml">
    <body>
      {% block content %}{% endblock %}
    </body>
</html>

content.html

{% extends "base.html" %}
{% block content %}
<table>
  <tr>
  {% include "footer.html" %}
  </tr>
</table>
{% endblock %}

footer.html

{% block footer %} <td> test</td>{% endblock %}

と電話します

env = Environment(loader=FileSystemLoader(os.path.join(path, "Layouts")))
template = env.get_template('content.html')
html = template.render()
print html
6

私は最近同じ問題に直面しました。いくつかの子テンプレートを継承したかったのですが、うまくいきました。それを説明するために、私のために働いた解決策をあなたに示したいと思います:

ブロックコンテンツがあり、manage.htmlによって拡張されたbase.htmlファイルがありました。そして、manage.htmlにはinternet_market.htmlによって拡張されたブロックsub_manageがあるので、視覚的には次のようになります。

|- base.html (block content)
|--manage.html (extends base.html)
|---sub_manage.html (extends manage.html)

レンダリングしたとき、everythinkは正常に機能しました。つまり、1回のレンダリングで複数の{%extends%}を使用できます。唯一のことは、cssまたはjsファイルへの相対リンクを使用している場合、それが機能しない可能性があるということです。むしろ、レンダリングされますが、css/jsファイルは見つかりません。お気に入り:

<head>  
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="../static/css/bootstrap.min.css">
<script type="text/javascript" src="../static/js/bootstrap.min.js"></script>
<style type="text/css">
</head>

その場合、url_forを使用して動的リンクを使用する必要があります。お気に入り:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="{{url_for("static", filename = "css/bootstrap.min.css")}}">
<script type="text/javascript" src="{{url_for("static", filename = "js/bootstrap.min.js")}}"></script>
<style type="text/css">
4
Max

ドキュメントを参照してください 拡張含む 、および インポート

これは、さまざまな目的で複数のファイルから機能を取得する手段を提供し、ネストの深さとは異なります。テンプレートを拡張するテンプレートを完全に拡張することができます...

3
brita_

次の方法を使用して、さまざまなレイアウトデザインのさまざまなコンテンツを1つのlayout.htmlに組み合わせることができます。

{% if instance == 'type1' %}

{% Elif instance == 'type2' %}

{% else %}

{% endif %}

...そして電話:

render_template('layout', instance='%s' % instance)

pythonコード。

1
lei dong