0

ドキュメントを調べましたが、答えが見つかりません。それはおそらく私が見逃しているばかげた基本的なものです。ピラミッド付きの jinja2 セットアップがあり、pyramid_jinja2 を使用しており、.ini ファイルにフィルターをセットアップしています。

jinja2.filters =
    model_url = pyramid_jinja2.filters:model_url_filter
    route_url = pyramid_jinja2.filters:route_url_filter
    static_url = pyramid_jinja2.filters:static_url_filter
    my_filter = myapp.view.my_filter

(my_filter は単純に各値に 100 を掛けます) これはうまくいきます:

@view_config(renderer="json",route_name="tester")
def tester(request):
    myList = [1,2,3,4]
    return render_to_response("templates/test.jinja2",{'myList':myList},request=request)

test.jinja2:

{% for l in myList %}
   {{ l | my_filter }}
{% endfor %}

ただし、これは次のことを行いません。

@view_config(renderer="json",route_name="tester")
def tester(request):
    myList = [1,2,3,4]
    tmplate = Template(u'''\
        {% for l in myList %}
           {{ l | my_filter  }}
        {% endfor %}
        ''')
    html = tmplate.render(myList = myList)
    return render_to_response("templates/test.jinja2",{'html':html},request=request)

test.jinja2:

{{ html | safe }}

私のエラーメッセージ:

jinja2.exceptions.TemplateAssertionError
TemplateAssertionError: no filter named 'my_filter'
4

1 に答える 1

3

テンプレートは環境にリンクされていないため、通常はどこでフィルターを定義しますか。テンプレート クラスの初期化により、メイン環境とは関係なく、自己環境が作成されます。

文字列からテンプレートを動的に作成し、フィルターを保持する場合は、次のようなものが必要です。

from jinja2 import Environment

env = Environment() # main environment, basically one per program.
env.filters['my_filter'] = lambda i: i * 100
template = env.from_string('{% for i in myList %}{{ i|my_filter }}_{% endfor %}')
print(template.render(myList=range(10)))
# 0_100_200_300_400_500_600_700_800_900_
于 2013-08-30T05:35:49.950 に答える