4

Jinja2にカスタムタグがあり、最初に呼び出されたときにのみ出力したいものがあります。したがって、次のテンプレートがあるとします。

1. {% only_once %}
2. {% only_once %}
3. {% only_once %}

出力を次のようにします。

1. "I only get printed once!"
2.
3.

これを行うための最良の方法は、テンプレートのコンテキストでフラグを設定して、すでに何かを印刷したかどうかを追跡することだと思います。これがコードサンプルですが、これは正しいですか?

class OnlyOnceExtension(Extension):
    tags = set(['only_once'])

    @contextfunction
    def parse(self, context, parser):
        if hasattr(context, 'my_flag') and context.my_flag:
            return Output("")
        else:
            return Output("I only get printed once!")

あれは正しいですか?コンテキストが不変であることについていくつか読んだので、これは機能しませんか?(http://jinja.pocoo.org/2/documentation/apiを参照し、不変を検索してください)

4

4 に答える 4

13

純粋に Jinja で実行したい場合は、その方法で loop.index 変数をチェックするだけです。

{% for bar in bars %}
    {% if loop.index == 1 %}
        Print me once
    {% endif %}
    Print me every time
{% endfor %}
于 2012-12-19T11:23:08.977 に答える
4

私の提案は、これを Python コードで実装することです。

class OnlyOnce(object):
    def __init__(self, data):
        self.data = data
        self.printed = False

    def __str__(self):
        if self.printed is False:
            self.printed = True
            return self.data
        return ''

Python コードでインスタンスを作成し、OnlyOnceそれをテンプレートに渡します。それを使用するたびに、単に{{ only_once }}.

多くの人が Jinja を使用していて気付いたことの 1 つは、彼らが Django のような方法、つまり拡張機能を作成したいということです。しかし、Jinja の式/インポート/何でも十分に強力なので、すべてに拡張機能を使用する必要はありません。

そして、はい、それを使用するのcontext.my_flagは悪い考えです。コンテキストを変更できるのはテンプレートだけです。これまで。

于 2010-07-28T16:36:11.090 に答える
1

ブール値とマクロを定義して、そこから進みます。変数を出力する代わりに、if ステートメントとブール値を使用して出力するかどうかを決定するマクロの結果を出力します。したがって、次のようになります。

{{ set was_printed = false }}
{% macro print_once(to_print) %}
    {% if was_printed is sameas false %}
        {{ to_print }}
        {% set was_printed = true %}
    {% endif %}
{% endmacro %}
1. {% print_once(only_once) %}
2. {% print_once(only_once) %}
3. {% print_once(only_once) %}
于 2010-07-01T15:37:52.930 に答える