QWeb テンプレート

QWeb は、Odo2 が使用する主要なテンプレート エンジンです。 これはXMLテンプレートエンジンの[#genshif]_で、主にHTML_フラグメントとページを生成するために使用されます。

テンプレートディレクティブは t- で始まるXML属性として指定されます。例えば、 :ref:の t-ifreference/qweb/conditionals で、要素やその他の属性が直接レンダリングされます。

要素のレンダリングを避けるために、プレースホルダ要素 <t> も利用できます。 ディレクティブを実行しますが、それ自体の出力は生成されません。

<t t-if="condition">
    <p>Test</p>
</t>

will result in:

<p>Test</p>

condition が true の場合は、

<div t-if="condition">
    <p>Test</p>
</div>

will result in:

<div>
    <p>Test</p>
</div>

データ出力

QWeb の出力ディレクティブ out は自動的に HTML 入力をエスケープし、ユーザーが提供するコンテンツを表示する際に XSS のリスクを制限します。

out は式を取り、それを評価し、結果をドキュメントに注入します。

<p><t t-out="value"/></p>

value42 yields`` を設定してレンダリングします。

<p>42</p>

より高度なトピックについては、 高度な出力 を参照してください。

条件

QWeb には、属性値として与えられた式を評価する条件付きディレクティブ if があります:

<div>
    <t t-if="condition">
        <p>ok</p>
    </t>
</div>

条件が true の場合、要素がレンダリングされます。

<div>
    <p>ok</p>
</div>

しかし、条件が false の場合、結果から削除されます。

<div>
</div>

条件付きレンダリングはディレクティブのベアラに適用されますが、これは``<t>``:

<div>
    <p t-if="condition">ok</p>
</div>

前の例と同じ結果が得られます。

追加の条件分岐ディレクティブ t-elift-else も利用できます:

<div>
    <p t-if="user.birthday == today()">Happy birthday!</p>
    <p t-elif="user.login == 'root'">Welcome master!</p>
    <p t-else="">Welcome!</p>
</div>

ループ

QWeb には反復するコレクションを返す式を foreach という反復ディレクティブがあります そして 2 番目のパラメータ t-as で、反復の「現在の項目」に使用する名前を指定します。

<t t-foreach="[1, 2, 3]" t-as="i">
    <p><t t-out="i"/></p>
</t>

以下のようにレンダリングされます:

<p>1</p>
<p>2</p>
<p>3</p>

条件と同様に foreach はディレクティブの属性を持つ要素に適用されます。

<p t-foreach="[1, 2, 3]" t-as="i">
    <t t-out="i"/>
</p>

は、前の例と同じです。

foreach は配列を反復することができます (現在のアイテムは現在の値になります) またはマッピング (現在のアイテムは現在のキーになります)。 整数での反復処理 (0 インクルーシブと与えられた整数排他の間の配列での反復処理と同等) はまだサポートされていますが、非推奨です。

t-as で渡された名前に加えて、foreach はさまざまなデータポイントに他の変数を提供します。

警告

$ast-as に渡された名前に置き換えられます

$as_all (非推奨)

繰り返される物体は

注釈

この変数はPythonではなく、JavaScript QWebでのみ使用できます。

$as_value

the current iteration value, identical to $as for lists and integers, but for mappings it provides the value (where $as provides the key)

$as_index

現在の反復インデックス (反復の最初の項目はインデックス0)

$as_size

コレクションの大きさが分かれば

$as_first

現在のアイテムがイテレーションの最初であるかどうか( に相当します。$as_index == 0

$as_last

現在のアイテムがイテレーションの最後のアイテムであるかどうか ( :samp:`{$as}_index + 1 == {$as}_size`に相当する) はイテレータのサイズが利用可能である必要があります

$as_parity (非推奨)

"even" または "odd" のいずれかを選択します。

$as_even (非推奨)

現在の反復回数が偶数インデックス上にあることを示す真偽値フラグ。

$as_odd (非推奨)

現在の繰り返し行が奇数インデックス上にあることを示す真偽値フラグ。

これらの追加変数と、 foreach に作成されたすべての新しい変数は、 foreach のスコープでのみ使用できます。 変数が foreach のコンテキスト外に存在する場合、値はforeach の最後にグローバルコンテキストにコピーされます。

<t t-set="existing_variable" t-value="False"/>
<!-- existing_variable now False -->

<p t-foreach="[1, 2, 3]" t-as="i">
    <t t-set="existing_variable" t-value="True"/>
    <t t-set="new_variable" t-value="True"/>
    <!-- existing_variable and new_variable now True -->
</p>

<!-- existing_variable always True -->
<!-- new_variable undefined -->

属性

QWeb は、属性をオンザフライで計算し、出力ノードの計算結果を設定することができます。 これは t-att (attribute) ディレクティブによって3つの異なる形式で行われます。

t-att-$name

「$name」という名前の属性が作成され、属性値が評価され、結果が属性の値として設定されます。

<div t-att-a="42"/>

以下のようにレンダリングされます:

<div a="42"></div>
t-attf-$name

以前と同じですが、パラメータは式の代わりに format string です。 多くの場合、リテラル文字列と非リテラル文字列を混在させるのに役立ちます (e. を選択します。

<t t-foreach="[1, 2, 3]" t-as="item">
    <li t-attf-class="row {{ (item_index % 2 === 0) ? 'even' : 'odd' }}">
        <t t-out="item"/>
    </li>
</t>

以下のようにレンダリングされます:

<li class="row even">1</li>
<li class="row odd">2</li>
<li class="row even">3</li>

ちなみに

フォーマット文字列には "plain_text {{code}}" (別名jinja-style) と ``"plain_text #{code}"(別名ruby-style)の 2 つの同等の構文があります。

t-att=mapping

パラメータがマッピングの場合、各 (キー、値) ペアは新しい属性とその値を生成します。

<div t-att="{'a': 1, 'b': 2}"/>

以下のようにレンダリングされます:

<div a="1" b="2"></div>
t-att=pair

パラメータがペア (タプルまたは 2 要素の配列) の場合。 ペアの最初の項目は属性の名前で、2番目の項目は値です:

<div t-att="['a', 'b']"/>

以下のようにレンダリングされます:

<div a="b"></div>

変数の設定

QWeb では、テンプレート内から変数を作成できます。 (複数回使う)計算をメモするために データの断片を明確な名前にして...

これは set ディレクティブによって行われ、作成する変数の名前を取ります。 設定する値は、以下の2つの方法で指定できます:

  • 式を含む t-value 属性とその評価結果が設定されます:

    <t t-set="foo" t-value="2 + 1"/>
    <t t-out="foo"/>
    

    3 を出力します

  • t-value 属性がない場合、ノードの本体がレンダリングされ、変数の値として設定されます。

    <t t-set="foo">
        <li>ok</li>
    </t>
    <t t-out="foo"/>
    

サブテンプレートを呼び出し中

QWeb テンプレートはトップレベルレンダリングに使用できます。 しかし、t-call ディレクティブを使用すると、別のテンプレート内からも使用できます。

<t t-call="other-template"/>

other_template が以下のように定義されている場合、名前付きテンプレートを親の実行コンテキストで呼び出します。

<p><t t-value="var"/></p>

上記の呼び出しは「<p/>」(コンテンツなし)としてレンダリングされますが、:

<t t-set="var" t-value="1"/>
<t t-call="other-template"/>

は``<p>1</p> ``としてレンダリングされます。

しかし、これは t-call の外側から見えるようにするという問題があります。 代わりに、call ディレクティブの本文に設定されたコンテンツは、サブテンプレートを呼び出す前に*評価され、ローカルコンテキストを変更することができます。

<t t-call="other-template">
    <t t-set="var" t-value="1"/>
</t>
<!-- "var" does not exist here -->

call ディレクティブの本文は任意に複雑になります (set ディレクティブだけではありません)。 そして、レンダリングされたフォームは、呼び出されるテンプレート内で魔法の 0 変数として利用可能になります:

<div>
    This template was called with content:
    <t t-out="0"/>
</div>

thusと呼ばれるのは:

<t t-call="other-template">
    <em>content</em>
</t>

will result in:

<div>
    This template was called with content:
    <em>content</em>
</div>

高度な出力

デフォルトでは、out はエスケープする必要がある HTML エスケープコンテンツを指定し、XSS からシステムを保護します。

エスケープする必要がない*コンテンツは、代わりにドキュメント内にそのまま注入され、ドキュメントの実際のマークアップの一部となる可能性があります。

唯一のクロスプラットフォーム「安全」コンテンツは、 t-call <reference/qweb/call>または :ref:`t-set <reference/qweb/set>`の出力で、「body」と一緒に使用されます (``t-value` または t-value とは対照的に)。

Python

通常はあまり気にする必要はありません。理にかなっているAPIは自動的に「安全な」コンテンツを生成し、物事が透明に動作するはずです。

以下のAPIは、デフォルトでは(再)エスケープされていない安全なコンテンツをテンプレートに挿入しますが、より明確にする必要がある場合には、以下のようにします。

  • :class:`HTMLフィールド <odoo.fields.Html> ` 。

  • html_escape()markupsafe.escape() (二重エスケープのリスクはありません)

  • html_sanitize()

  • markupsafe.Markup.

    警告

    :class:`markupafe. arkup`は安全ではないAPIであり、マークアップセーフであることを*アサーション*にしたいが、必ずしもそれを確認することはできない。 気をつけて使うべきです

  • to_text() はコンテンツを安全としてマークしませんが、その情報を安全なコンテンツから取り除くことはありません。

ダブルエスケープを強制する

コンテンツが安全としてマークされているが、何らかの理由でエスケープする必要がある場合 (例: HTMLフィールドのマークアップを表示すると、安全フラグeを「削除」するために通常の文字列に戻すことができます。 Pythonでは`str(content)`、Javascriptでは`String(content)`。

注釈

Because Markup is a much richer type than Markup(), some operations will strip the safety information from a Markup() but not a Markup e.g. string concatenation ('' + content) in Python will result in a Markup with the other operand having been properly escaped, while in Javascript will yield a String() where the other operand was not escaped before the concatenation.

非推奨の出力ディレクティブ

esc

out のエイリアスは、もともと入力をエスケープします。 outesc の唯一の違いとして、正式に廃止されていないのは、後者が少し不明瞭/間違っていることです。

raw

コンテンツをエスケープしないバージョンの out 。コンテンツは安全かどうかに関わらずそのまま放出されます。

バージョン 15.0 で非推奨: 代わりに outmarkupsafe.Markup の値で使用します。

t-raw は廃止されました。なぜなら、コードが producting として内容が進化するにつれて、マークアップに使用されることを追跡するのは難しいかもしれないからです。 より複雑なレビューや危険な経過につながります

Python

排他的なディレクティブ

Asset bundles

「スマートレコード」フィールドの書式設定

t-field ディレクティブは、"スマート" レコード(ブラウズ メソッドの結果)上でフィールドアクセス (a.b) を行うときにのみ使用できます。 フィールドタイプに基づいて自動的にフォーマットすることができ、ウェブサイトのリッチテキスト編集に統合されています。

t-options はフィールドをカスタマイズするために使用できます。最も一般的なオプションは widget で、その他のオプションは field-or widget-dependentです。

デバッグ

t-debug

空の値で、 :func:の breakpoint 組み込み関数を呼び出します。これは通常、デバッガ(デフォルトでは:mod:pdb )を呼び出します。

動作は PYTHONBREAKPOINT または sys.breakpointthook() で設定できます。

キャッシュのレンダリング:

t-cache="key_cache" タグはレンダリング時にキャッシュされるテンプレートの一部です。すべてのサブディレクティブは最初のレンダリング時にのみ呼び出されます。 これは、これらのサブディレクティブのレンダリング中に除去された sql クエリも 1 回だけ実行されることを意味します。

t-nocache="documentation" タグは毎回レンダリングされるテンプレートの一部です。コンテンツはルート値のみを使用できます。

なぜ t-cache を使うのか?

このディレクティブは、最終文書の一部をキャッシュすることでレンダリングを高速化するために使用されます。このディレクティブは、データベースへのクエリを保存することができます。 しかし、t-cache は必然的にテンプレート (例えば t-set への理解など) を複雑にしますので、慎重に使うべきです。

ただし、実際にデータベースのクエリを保存するには、遅延評価される値でテンプレートをレンダリングする必要がある場合があります。 キャッシュされた部分でこれらの遅延値が使用されている場合、キャッシュで使用可能な部分が評価されません。

t-cache ディレクティブは、限られたデータ量に依存する値を使用するテンプレート部品に役立ちます。 プロファイラを使ってテンプレートのレンダリングを解析することをお勧めします("Add qweb ディレクティブ context" オプションを有効にする)。 lazy 値をコントローラでレンダリングに渡すと、これらの値を使用してディレクティブを表示し、クエリをトリガーすることができます。

このようなキャッシュを使用することで、異なるユーザーが利用できるようになります(異なるユーザーはキャッシュされたパーツを同じ方法でレンダリングする必要があります)。 もう一つの潜在的な問題は、必要に応じてエントリを無効にすることです。 後者の場合は、キー式 を賢く選んでください。 レコードセットの write_date を使用すると、キャッシュから明示的に破棄することなくキャッシュキーを期限切れにすることができます。

t-cache パーツの値がスコープされていることにも注意する必要があります。 これは、このテンプレートに t-set ディレクティブがある場合に意味します。 t-cache ディレクティブが存在しない場合と、その後のレンダリングは異なる可能性があります。

t-cache の中に t-cache がある場合はどうでしょうか?

部品はキャッシュされます。それぞれ、レンダリングに対応する文字列のみを含みます。 したがって、内部の t-cache はおそらく読み取られる頻度は低く、キャッシュキーが必ずしも使用されるわけではありません。 この場合、t-nocache を追加する必要があります(同じノードまたは親ノード)。

t-nocache は何に使われていますか?

t-cache でテンプレートの一部をキャッシュしたいが、小さな部分は動的なままで、キャッシュ時に評価する必要があります。 ただし、t-nocache の部分はテンプレートの t-set 値にはアクセスできません。 そこにはコントローラが提供する<unk> <unk> の値だけがアクセスできます。 例えば、 メニューは常に同じで、レンダリングに時間がかかるためキャッシュされます(qweb コンテキストのパフォーマンス開発ツールを使用すると調査できます)。 ただし、メニューでは、eコマースカートを常に最新の状態にしておきたいので、この部分を動的に保つために t-nocache があります。

t-cache のベース

t-cache ディレクティブを使用すると、レンダリングされたテンプレートの結果を保存できます。 キー式 (例 42: t-cache="42") はPython式として評価されます。 これは**キャッシュキー**を生成するために使用されます。したがって、同じテンプレート部分に異なる**キャッシュ値**(キャッシュされたレンダリング部分)があります。 **key expression**がタプルまたはリストの場合、**cache key**を生成するときに検索されます。 **key expression**によって1つ以上のレコードセットが返された場合、モデルが返されます。 idとそれに対応するwrite_dateは**キャッシュキー**の生成に使用されます。 特殊な場合: **key式**がFalsy値を返した場合、コンテンツはキャッシュされません。

例:

<div t-cache="record,bool(condition)">
    <span t-if="condition" t-field="record.partner_id.name">
    <span t-else="" t-field="record.partner_id" t-options-widget="contact">
</div>

この場合、既に真の条件で返された各レコードに対応するキャッシュに<unk> <unk> (文字列) の値があるかもしれません。 間違った状態にあることを示しています モジュールがレコードを変更した場合、変更された write_date は、キャッシュされた値が破棄されます。

t-cache とスコープ付き値 (t-set, t-foreach...)

t-cache の値はスコープされます。これは親ノードの t-cache を持っているか持っていないかの間の動作の変更を含みます。 Odooは多くのテンプレート、t-call や継承を使用していることを考慮することを忘れないでください。 t-cache を追加すると、編集時に表示されないテンプレートのレンダリングを変更できます。 (t-foreach は反復ごとに``t-set`` のようです)

例:

<div>
    <t t-set="a" t-value="1"/>
    <inside>
        <t t-set="a" t-value="2"/>
        <t t-out="a"/>
    </inside>
    <outside t-out="a"/>

    <t t-set="b" t-value="1"/>
    <inside t-cache="True">
        <t t-set="b" t-value="2"/>
        <t t-out="b"/>
    </inside>
    <outside t-out="b"/>
</div>

Will render:

<div>
    <inside>2</inside>
    <outside>2</inside>

    <inside>2</inside>
    <outside>1</inside>
</div>

t-nocache のベース

t-nocache 属性を持つノードに含まれるテンプレート部分はキャッシュされません。したがって、このコンテンツは 動的 であり、体系的にレンダリングされます。 しかし、使用可能な値はコントローラによって提供される値です (_render メソッドを呼び出すとき)。

例:

<section>
    <article t-cache="record">
        <title><t t-out="record.name"/> <i t-nocache="">(views: <t t-out="counter"/>)</i></titlle>
        <content t-out="record.description"/>
    </article>
</section>

Will render (counter = 1):

<section>
    <article>
        <title>The record name <i>(views: 1)</i></titlle>
        <content>Record description</content>
    </article>
</section>

ここでは、コンテナを含む「<i>」タグが常にレンダリングされます。残りはキャッシュ内の単一の文字列として表示されます。

t-nocache と scoped root 値 (t-set, t-foreach...)

t-nocache タグの内容はドキュメントに使用し、ディレクティブが追加される理由を説明することができます。 値は t-nocache にスコープされます。これらの値はルート値のみです (コントローラによって提供される値および/または irr ``_render メソッドを呼び出す場合)。 web``). t-set はテンプレート部分で実行できますが、他の部分では使用できません。

例:

<section>
    <t t-set="counter" t-value="counter * 10"/>
    <header t-nocache="">
        <t t-set="counter" t-value="counter + 5"/>
        (views: <t t-out="counter"/>)
    </header>
    <article t-cache="record">
        <title><t t-out="record.name"/> <i t-nocache="">(views: <t t-out="counter"/>)</i></titlle>
        <content t-out="record.description"/>
    </article>
    <footer>(views: <t t-out="counter"/>)</footer>
</section>

Will render (counter = 1):

<section>
    <header>
        (views: 6)
    </header>
    <article>
        <title>The record name <i>(views: 1)</i></titlle>
        <content>Record description</content>
    </article>
    <footer>(views: 10)</footer>
</section>

ここでは、コンテナを含む「<i>」タグが常にレンダリングされます。 残りの部分はキャッシュ内の単一文字列ですが、カウンタは t-nocache から t-set で更新されません。

t-nocache-* はキャッシュにプリミティブ値を追加します

テンプレートで生成された値を使用できるようにするために、それらをキャッシュすることができます。 ディレクティブは t-nocache-*="expr" として使用されます。ここで * は選択された値の名前、Python 式 expr はキャッシュされます。 キャッシュした値はプリミティブ型でなければなりません。

例:

<section t-cache="records">
    <article t-foreach="records" t-as="record">
        <header>
            <title t-field="record.get_method_title()"/>
        </header>
        <footer t-nocache="This part has a dynamic counter and must be rendered all the time."
                t-nocache-cached_value="record.get_base_counter()">
            <span t-out="counter + cached_value"/>
        </footer>
    </article>
</section>

cached_valuet-cache="records" のキャッシュテンプレート部分でキャッシュされ、毎回スコープ付きのルート値に追加されます。

Helpers

リクエストベース

QWebのほとんどのPython側での使用はコントローラ(およびHTTPリクエスト中)です。 この場合、データベースに格納されているテンプレート( views)は、 odooを呼び出すことによって簡単にレンダリングできます。 ttp.HttpRequest.render():

response = http.request.render('my-template', {
    'context_value': 42
})

これにより自動的に Response オブジェクトが作成され、コントローラから返されます(または、スーツにさらにカスタマイズされます)。

表示ベース

前のヘルパーよりも深いレベルでは、ir'render メソッドがあります。 web`` (データベースを使用しない) と public module method render (データベースを使用しない):

_render(id[, values])

QWeb ビュー/テンプレートをデータベース ID または 外部 ID でレンダリングします。テンプレートは ir.qweb レコードから自動的に読み込まれます。

_prepare_environment メソッドはレンダリングコンテキストで多くのデフォルト値を設定します。http_routingwebsite アドオンも必要なデフォルト値です。 minimal_qcontext=False オプションを使用すると、public メソッド render のようなデフォルト値を避けることができます。

request

現在の Request オブジェクトがあれば、

debug

現在のリクエストが debug モードであるかどうか

quote_plus

urlエンコードユーティリティ関数

json

対応する標準ライブラリモジュール

時間

対応する標準ライブラリモジュール

datetime

対応する標準ライブラリモジュール

relativedelta

モジュールを見る

keep_query

keep_query ヘルパー関数

パラメータ
  • values -- レンダリングのために QWeb に渡すコンテキスト値

  • engine (str) -- レンダリングに使用する Odoo モデルの名前 QWeb をローカルに展開したりカスタマイズしたりするために使用することができます(ir に基づいて "new" qweb を作成します)。 web`` alterations)

render(template_name, values, load, **options)
load(ref)()

は、etree オブジェクト ref を返します。

Javascript

排他的なディレクティブ

テンプレートの定義

t-name ディレクティブはテンプレートファイルのトップレベルにのみ配置できます (ドキュメントルートへの直接の子要素)。

<templates>
    <t t-name="template-name">
        <!-- template code -->
    </t>
</templates>

It takes no other parameter, but can be used with a <t> element or any other. With a <t> element, the <t> should have a single child.

テンプレート名は任意の文字列ですが、複数のテンプレートが関連している場合(例: (サブテンプレートと呼ばれる)ドット区切りの名前を使って階層的な関係を示すのが慣例です。

テンプレートの継承

テンプレートの継承は以下のいずれかに使用されます:
  • 既存のテンプレートをインプレースで変更します。例えば、テンプレートに情報を追加します。

他のモジュールによって作られました
  • 指定された親テンプレートから新しいテンプレートを作成します

テンプレートの継承は2つのディレクティブを使用して行われます:
  • 継承するテンプレートの名前である ``t-inherited from

  • 継承の動作である t-継承モード を使用します。親テンプレートから新しい子テンプレートを作成する場合は primary に設定するか、親テンプレートを変更する場合は extension に設定します。

オプションの t-name ディレクティブも指定できます。 プライマリモードで使用する場合、新規作成されたテンプレートの名前になります そうでなければ、遺産のリトレースを助けるために変換されたテンプレートへのコメントとして追加されます。

継承自体については、 xpaths ディレクティブを使用して変更を行います。利用可能な命令の完全なセットについては XPATH のドキュメントを参照してください。

プライマリ継承(子テンプレート):

<t t-name="child.template" t-inherit="base.template" t-inherit-mode="primary">
    <xpath expr="//ul" position="inside">
        <li>new element</li>
    </xpath>
</t>

エクステンションの継承(場所変換):

<t t-inherit="base.template" t-inherit-mode="extension">
    <xpath expr="//tr[1]" position="after">
        <tr><td>new cell</td></tr>
    </xpath>
</t>

古い継承機構(非推奨)

テンプレートの継承は、パラメータとしてテンプレートの名前を取る``t-extend`` ディレクティブによって行われます。

t-extend ディレクティブは、t-name と組み合わせると主要な継承となり、単独で使用する場合は拡張子として動作します。

どちらの場合も、任意の数の t-jquery サブディレクティブで変更が行われます。

<t t-extend="base.template">
    <t t-jquery="ul" t-operation="append">
        <li>new element</li>
    </t>
</t>

t-jquery ディレクティブは CSS セレクター を取ります。 このセレクターは拡張テンプレート上で指定された t-operation が適用される コンテキストノード を選択するために使用されます。

append

ノードの本体はコンテキストノードの末尾に追加されます (コンテキストノードの最後の子の後)

prepend

(コンテキストノードの最初の子ノードの前に挿入される) コンテキストノードのボディの前に追加されます。

before

ノードの本文はコンテキストノードのすぐ前に挿入されます。

after

ノードの本体はコンテキストノードのすぐ後に挿入されます

inner

ノードの本体はコンテキストノードの子要素を置き換えます

replace

ノードの本体はコンテキストノード自体を置き換えるために使用されます

attributes

ノードの本体は任意の数の attribute 要素でなければなりません。それぞれに name 属性とテキストコンテンツがあります。 コンテキストノードの名前付き属性は指定された値に設定されます (すでに存在する場合に置き換えられるか、ない場合に追加されます)

操作なし

t-operation が指定されていない場合、テンプレート本体は javascript コードとして解釈され、コンテキストノードは this として実行されます。

警告

他の操作よりもはるかに強力ですが、このモードはデバッグとメンテナンスがはるかに困難ですが、それを避けることをお勧めします。

デバッグ

javascript QWeb 実装では、いくつかのデバッグ用のフックが用意されています。

t-log

式パラメータを取得し、レンダリング中の式を評価し、結果を console.log:: で記録します。

<t t-set="foo" t-value="42"/>
<t t-log="foo"/>

コンソールに 42 を出力します

t-debug

テンプレートのレンダリング中にデバッガブレークポイントをトリガーする:

<t t-if="a_test">
    <t t-debug=""/>
</t>

デバッグがアクティブな場合は実行を停止します (正確な条件はブラウザと開発ツールに依存します)

t-js

ノードの本体はテンプレートのレンダリング時に実行される javascript コードです。 context パラメータを取得します。これはレンダリングコンテキストが``t-js``のbodyで使用できる名前です。

<t t-set="foo" t-value="42"/>
<t t-js="ctx">
    console.log("Foo is", ctx.foo);
</t>

Helpers

core.qweb

(core は web.core モジュール) QWeb2 のインスタンス。 すべてのモジュール定義テンプレートファイルがロードされ、標準のヘルパーオブジェクト ``_`() (アンダースコア)、_t (翻訳関数)、JSONへの参照が含まれています。

:js:func:`core.qweb.render <QWeb2.Engine.render>`は基本的なモジュールテンプレートを簡単にレンダリングするために使用できます

API

class QWeb2.Engine()

QWeb "renderer"は、QWebのロジック(テンプレートのロード、パース、コンパイル、レンダリング)のほとんどを処理します。

Odoo Web は、コアモジュール内のユーザーの 1 つをインスタンス化し、それを core.qweb にエクスポートします。 また、様々なモジュールのすべてのテンプレートファイルをそのQWebインスタンスにロードします。

QWeb2.Engine() も「テンプレート名前空間」として機能します。

QWeb2.Engine.QWeb2.Engine.render(template[, context])

context (指定されている場合) を使用して、以前にロードされたテンプレートを文字列にレンダリングします。テンプレートのレンダリング時にアクセスされた変数を見つけます (例えば表示する文字列)。

引数
  • template (String()) -- レンダリングするテンプレートの名前

  • context (Object()) -- テンプレートレンダリングに使用する基本的な名前空間

戻り値

文字列

エンジンは、場合によっては役に立つかもしれない他のメソッドを公開します (例: 別のテンプレート名前空間が必要な場合、Odoo Webでカンバンビューは独自の:js:class:QWeb2を取得します。 ngine インスタンスは、テンプレートがより一般的な「モジュール」テンプレートと衝突しないようにします。

QWeb2.Engine.QWeb2.Engine.add_template(templates)

QWeb インスタンス内のテンプレート ファイル (テンプレートのコレクション) を読み込みます。テンプレートは次のように指定できます:

XML 文字列

QWeb は XML ドキュメントへのパースを試み、ロードします。

URL

QWeb は URL コンテンツをダウンロードし、結果の XML 文字列をロードしようとします。

Document または Node

QWeb はドキュメントの最初のレベル(提供された root の子ノード)を横断し、名前付きテンプレートまたはテンプレートのオーバーライドをロードします。

QWeb2.Engine() は動作のカスタマイズのために様々な属性を公開します。

QWeb2.Engine.QWeb2.Engine.prefix

プレフィックスは解析中にディレクティブを認識するために使用されます。文字列。デフォルトでは t です。

QWeb2.Engine.QWeb2.Engine.debug

ブールフラグはエンジンを「デバッグモード」にします。通常、QWebはテンプレートの実行中に発生したエラーをインターセプトします。 デバッグモードでは、すべての例外が傍受されることなく処理されます。

QWeb2.Engine.QWeb2.Engine.jQuery

テンプレートの継承処理中に使用される jQuery インスタンス。デフォルトは window.jQuery です。

QWeb2.Engine.QWeb2.Engine.preprocess_node

Function が存在する場合、各 DOM ノードをテンプレートコードにコンパイルする前に呼び出されます。 Odoo Web では、これはテンプレート内のテキストコンテンツといくつかの属性を自動的に翻訳するために使用されます。デフォルトは null です。

1

これは Genshi に似ていますが、 XML 名前空間 は使われません (そしてサポートされていません)

2

歴史的な理由や使用事例によく合うからといって他にもいくつか使うことがあります Odoo 9.0 は JinjaMako に依存します。