0

jingoを通じてjinja2を使用してDjangoアプリを開発しています。で定義されたマクロがあり、でtemplates/macros.html定義されたフィルターから呼び出す必要がありhelpers.pyます。これは、渡す必要があるパラメーターにある種の python-logic が含まれているためです。そうする方法はありますか?

私が達成したいのはこのようなものです:

templates/macros.html:

{% macro render_link(obj) -}
    <a href="{{ obj.get_absolute_url() }}">{{ obj }}</a>
-%}

helpers.py:

@register.filter
def as_link(obj_or_list):
    if hasattr(obj_or_list, '__iter__'):
        for obj in obj_or_list:
            # call `render_link(obj)` here and concat results somehow
    else:
        # call `render_link(obj_or_list)` here 

必要なときはいつでも、テンプレートで:

{{ an_object|as_link }}

ここでフィルターを使用する必要があるのは、パラメーターをマクロに渡す前にパラメーターを処理する必要があるためです。マクロ自体にロジックを記述できることはわかっていますが、いくつかのメソッドを jinja2 環境 (hasattr例のように) に追加する必要があり、関連するロジックが複雑すぎる場合、これは実行できません。

4

2 に答える 2

1

少し調査した後、私は解決策を見つけました。マクロはテンプレートで定義されているので、まずそれをロードする必要がありました。ソースコードを読んで、テンプレートインスタンスからマクロ関数を取得する方法を見つけたので、これを行う正しい方法は次のとおりです。

@register.filter()
def as_link(obj_or_list):
    from jingo import env

    template = env.get_template('macros.html')
    render_link = template.module.render_link

    if hasattr(obj_or_list, '__iter__'):
        return ''.join((render_link(obj) for obj in obj_or_list))
    return render_link(obj_or_list)
于 2012-12-06T07:21:41.883 に答える
0

これで動くかどうかはわかりませんが、マクロがグローバル関数として登録されているのかもしれません。マクロとグローバル Python 関数は、テンプレートから同じ方法で呼び出すことができます。

マクロが登録されている場合は、次のことができます。

env.globals['render_link'](obj)

これが機能するようになった場合は、いつでもマクロ コードを Python コードとしてフィルターに含めることができます。フィルターには、すべての Python パワーがあります。

于 2012-12-05T23:52:21.917 に答える