Jinja2の複数レベルテンプレート継承?
-
21-09-2019 - |
質問
私は貿易でHTML/CSSを行っており、テンプレートデザイナーとしてDjangoプロジェクトに出入りしています。私は現在、jinja2を使用しているサイトに取り組んでいます。これは約2週間使用しています。私は、Jinja2が複数のレベルのテンプレート継承をサポートしていないことをドキュメントを読んで見つけました。
{% extends "foo" %}
レンダリングごと。これをDjangoで行うことができると確信しています。これは、ベーステンプレートを指定し、それに基づいて3つまたは4つのテンプレートを指定し、それらのベーステンプレートを使用してページの肉を構築できるため、強力です。継承のポイントではないので、あなたは抽象化する力をもっと持っているので、あなたはユニークなコードを本当にいじっているだけですか?
いずれにせよ、私はここで何をすべきか分かりません。 Djangoテンプレートと同じように機能するような何らかの方法があるかどうかはわかりません。私はDjangoまたはJinja(2)の専門家ではありませんが、必要な情報を提供できます。
解決
ドキュメントがそれを表現した方法では、それは継承(n)のレベルを深くサポートしていないように見えました。
Pythonとは異なり、Jinjaは複数の継承をサポートしていません。したがって、レンダリングごとに呼ばれるタグを1つだけ拡張することができます。
私はそれがテンプレートごとに1が拡張されるというルールであるとは知りませんでした。
他のヒント
JINJA2を使用して複数のレベルのテンプレートを達成する最良の方法の1つは、「あなたが持っている」を「含める」を使用することです。base_layout.html'ベーステンプレートとして
<!DOCTYPE html>
<title>Base Layout</title>
<div>
<h1>Base</h1>
.... // write your code here
{% block body %}{% endblock %}
</div>
そして、あなたは持っていることを望んでいます」child_layout.html「それが拡張される」base_layout。
{% include "base_layout.html" %}
<div>
... // write your code here
</div>
{% block body %}{% endblock %}
そして今、あなたのページはただ拡張することができます」child_layout.html'そしてそれは両方を持っています base_layout.html と child_layout.html
{% extends "child_layout.html" %}
{% block body %}
...// write your code here
{% endblock %}
これを試してみてください、@ixmの回答のおかげで、これは私のために作品です。
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
私は最近同じ問題に直面しました。私はいくつかの子供のテンプレートを継承したかったのですが、それはうまくいきました。それを説明するために、私はあなたに私のために働いた解決策を見せたいと思います:
ブロックコンテンツを備えたbase.htmlファイルがあり、manage.htmlによって拡張されました。そして、そのmanage.htmlには、internet_market.htmlによって拡張されたブロックsub_manageがありますので、視覚的には次のように見えます。
|- base.html (block content)
|--manage.html (extends base.html)
|---sub_manage.html (extends manage.html)
レンダリングすると、すべてのシンクが正常に機能しました。つまり、1つのレンダリングでいくつかの{%拡張%}を持つことができます。唯一のことは、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">
次の方法を使用して、さまざまなレイアウトデザインのさまざまなコンテンツを単一のレイアウト.htmlに結合することができます。
{% if instance == 'type1' %}
{% elif instance == 'type2' %}
{% else %}
{% endif %}
...そして電話:
render_template('layout', instance='%s' % instance)
Pythonコードで。