10

私はフロント エンド開発者であり、Jinja2 を効果的に使用する方法を知りたいと思っています。現在のサイトを微調整して、継承を使用して複数の基本テンプレートを持ち、ブロック タグを完全に使用してコンテンツを置き換えてオーバーライドし、マクロを使用して引数の受け渡しをサポートしたいと考えています。

私の基本テンプレートには、次のコードが含まれています (簡単にするために編集されています)。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
{% from "foo.html" import macro1, macro2, macro3 %}
{% macro base_template(title=none, arg2=none, urls={}, arg3=false) %}
<html>
  <title>{{ title }} | Site.com</title>
  ....
  {{ caller() }}
  ....
</html>
{% endmacro %}

{% block content %}{% endblock %}

そして、それを拡張する私のページは次のようになります。

{% extends "base.html" %}
{% block content %}
{% call base_template(title="home", arg2="active", arg3="true") %}
(html code here)
{% endcall %}
{% endblock %}

したがって、基本的にすべてのページが base を拡張し、マクロを呼び出してそのマクロに引数を渡します。私はそれをすべて理解しているわけではありませんが、主なポイントは、これによりデフォルト値と、ブロック全体を再定義する必要のないある程度の柔軟性が可能になるということです。これにより、ある程度の柔軟性とパワーが得られます。繰り返しますが、これは非常に単純化されています。

唯一の問題は、これによりブロックを使用する能力が無効になることです。マクロは柔軟性のためのものですが、ブロックを使用すると、何かを完全にオーバーライドしたり、親のコンテンツを使用して追加したりできますが、マクロでは実行できません (少なくとも私は考えていません)。問題は、ブロックでラップできないことです。そうしないと、マクロの値が表示されません。たとえば、次のようにします。

{% block title %}<title>{{ title }} | Site.com</title>{% endblock %}

title is undefined と表示されるため失敗します。

最終的には、ブロックの力と組織的な側面の両方を利用する方法を探していますが、それでもマクロの論理と簡潔さを利用することができます. この問題にどう対処するかについて、誰かが私に何か助けを与えることができれば、本当に感謝しています.

4

1 に答える 1

22

ブロックは、テンプレートのトップレベルでのみ定義できます。setテンプレートを拡張すると、タグを使用して子テンプレートに設定された値に、拡張しているテンプレートからアクセスできるようになります。たとえば、次の名前のテンプレートがある場合layout.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
  <title>{{ title }} | Site.com</title>
  ....
  {% block content %}{% endblock content %}
  ....
</html>

そして、あなたはこの子テンプレートを持っています、index.html

{% extends "layout.html" %}
{% set title = 'Homepage' %}
{% block content %}
(html code here)
{% endblock content %}

次に、title親のへの参照はに解決され'Homepage'ます。これは、任意のタイプの変数で実行できます。あなたがしていることについては、マクロは必要ないと思います-この機能を利用してブロックをうまく配置すれば、レイアウトに関する限り、必要なことのほとんどすべてを行うことができます。 。Jinja2のさまざまな機能をいつ使用するかを知りたい場合は、Jinja2の作成者の1人が作成したPlurkSolaceで使用されているテンプレートのいくつかを見てみます。

于 2010-01-20T22:32:24.067 に答える