48

Jinja2でコード生成を行っていますが、2つのリスト(つまり、変数名と型)を一緒に繰り返し処理したいのですが、これを行う簡単な方法はありますか、それとも事前に圧縮されたリストを渡す必要がありますか?ドキュメントやグーグルでそのような関数を見つけることができませんでした。

4

4 に答える 4

55

必要に応じて、jinja2.Environmentグローバル名前空間自体を変更します。

import jinja2
env = jinja2.Environment()
env.globals.update(zip=zip)
# use env to load template(s)

これは、ビュー (テンプレート) ロジックをアプリケーション ロジックから分離するのに役立つ場合がありますが、その逆も可能になります。#関心の分離

于 2011-03-07T18:51:55.500 に答える
23

Flaskを使用しているかどうかについて言及しなかったので、調査結果を追加すると思いました。

Flask で使用される Jinja2 環境で関数をrender_template()使用して 'zip' フィルターを作成することによって使用されます。zip()

app = Flask(__name__)
...
app.jinja_env.filters['zip'] = zip

これをテンプレート内で使用するには、次のようにします。

{% for value1, value2 in iterable1|zip(iterable2) %}
    {{ value1 }} is paired with {{ value2 }}
{% endfor %}

文字列は反復可能な Jinja2 であることに注意してください。そのため、文字列に圧縮しようとすると、おかしなことになるでしょう。圧縮したいものが文字列ではなく反復可能であることを確認するには、次のようにします。

{%  if iterable1 is iterable and iterable1 is not string 
   and iterable2 is iterable and iterable2 is not string %}
    {% for value1, value2 in iterable1|zip(iterable2) %}
        {{ value1 }} is paired with {{ value2 }}
    {% endfor %}
{% else %}
  {{ iterable1 }} is paired with {{ iterable2 }}
{% endif %}
于 2017-09-29T19:04:28.640 に答える
3

テンプレート言語では、for ループで 2 つのコンテナーの zip を実行できるとは思いません。これはdjangoに対する同様の質問であり、jinjaテンプレートはdjangoに非常に近いものです。

圧縮されたコンテナーを事前にビルドし、テンプレートに渡します。

>> for i,j in zip(range(10),range(20,30)):
...     print i,j
... 

に等しい

>>> [(i,j) for i,j in zip(range(10),range(20,30))]
于 2011-03-06T02:42:03.007 に答える