Jinja2のでは、どのように私はブロックタグと組み合わせてマクロを使用することができますか?

StackOverflow https://stackoverflow.com/questions/2104957

質問

私は、フロントエンドの開発者だ、と私は効果的に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 %}

だから、基本的にすべてのページがベースの延長、彼らはマクロを呼び出し、そのマクロに引数を渡します。私はかなりそれをすべて理解していないが、主な点は、これがデフォルト値とブロック全体を再定義する必要はありませんある程度の柔軟性を可能にするということである:それは柔軟性とパワーのある程度を提供します。ここでも、これが大きく簡素化されます。

唯一の問題は、このブロックを使用する私の能力を否定する、です。マクロは、柔軟性のためですが、ブロックして、私は完全に何かを上書きする、あるいはその親の内容を使用し、(少なくとも私は考えていない)私はマクロで行うことができない、それに追加する能力を持っています。問題は、私は、彼らがマクロの値が表示されません他に、ブロック単位で物事をラップすることはできません。例えば、これをやってます:

{% block title %}<title>{{ title }} | Site.com</title>{% endblock %}
それはタイトルが定義されていないと言うだろうので、

は失敗します。

最終的に私はパワーとブロックのorganiztional側面の両方を利用するが、それでも、マクロのロジック&簡潔を利用することができるようにする方法を探しています。誰かが私に私はこの問題については行くかもしれない方法のように任意の助けを与えることができれば、私はそれを本当に感謝しています。

役に立ちましたか?

解決

ブロックは、テンプレートのトップレベルでのみ定義可能です。テンプレートを拡張する場合、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'に解決します。あなたは、変数のいずれかのタイプでこれを行うことができます。あなたがやっていることについては、私はマクロの必要があるとは思わない - あなたも、この機能や場所のブロックを利用する場合、あなたは限りレイアウトを懸念しているとして実行する必要がほとんどすべてを行うことができるようになります。私は、 Plurkの慰めするで使用するテンプレートのいくつかを見てみますあなたはJinja2ののさまざまな機能を使用する際の良いアイデアを取得したい場合は、Jinja2のの著者の一人によって書かれています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top