2

各ダッシュボードアイテムのコンテキストに名前空間を付けるダッシュボードがあります。辞書のすべての値をテンプレートのキーに設定する簡単な方法はありますか?

テンプレートを再利用したいのですが、変数の名前空間を常に指定しているわけではありません。

私のコンテキストは、次のように簡略化できます。

{
 "business": {"businesses": [], "new_promotions": []}, 
 "messages": {"one_to_one": [], "announcements": []
}

したがって、withステートメントでは、すべてのビジネスアイテムをローカルに設定して含めるようにします。現在これを行うには、各変数を個別に設定する必要があります。

{% with %}
  {% set businesses = business["businesses"] %}
  {% set new_promotions = business["new_promotions"] %}
  {% include "businesses.html" %}
{% endwith %}

私は試した:

{% with %}
  {% for key, value in my_dict %}
    {% set key = value %}
  {% endfor %}
  {% include "businesses.html" %}
{% endwith %}

ただし、forループにはスコープしかないため、includeにはスコープがありません...

4

2 に答える 2

4

簡単に言うと、コンテキストに任意の変数を設定することはできません。これ{% set key = value %}は、指定された値に指定された変数を設定するだけkeyです。

その理由は、Jinja2がテンプレートをPythonコードにコンパイルするためです。(テンプレートが生成するコードを確認したい場合は、http://ryshcate.leafstorm.us/paste/71c95831ca0f1d5でスクリプトをダウンロードし、テンプレートのファイル名を渡します。)処理を高速化するために、すべてのローカル変数を作成します。すべての変数検索にコンテキストを使用するDjangoとは対照的に、テンプレートで使用する変数(最初に検出されたときにのみコンテキストで変数を検索します)。

このコードを適切に生成するには、特定の時点で存在するローカル変数またはグローバル変数を追跡できる必要があります。これにより、コンテキストでいつ検索するかがわかります。また、確率変数を設定すると、これが機能しcontextfunctionなくなります。そのため、sはコンテキストを変更できず、表示するだけです。

ただし、私が行うことは、ビジネス表示コードをインクルードテンプレートにする代わりに、別のテンプレートのマクロにすることです。たとえば、businesses.html

{% macro show_businesses(businesses, new_promotions) %}
  {# whatever you're displaying... #}
{% endmacro %}

そして、メインテンプレートで:

{% from "businesses.html" import show_businesses %}
{% show_businesses(**businesses) %}

または、さらに良いことに、それらを2つの別々のマクロに分割します。1つはビジネス用で、もう1つは新しいプロモーション用です。http://bitbucket.org/plurk/solace/src/tip/solace/templates/で多くのクールなテンプレートのトリックを見ることができます。もちろん、 http://jinja.pocoo.org/2でJinja2のドキュメントを確認してください。/ documentation/templates

于 2010-07-28T16:21:48.423 に答える
1

私は回避策を見つけました-コンテキスト関数を作成することで、テンプレートをレンダリングし、コンテキストを直接設定したり、コンテキストをマージしたりできます(ただし、それが良い習慣かどうかはわかりません)。

@jinja2.contextfunction
def render(context, template_name, extra_context, merge=False):
    template = jinja_env.get_template(template_name)

    # Merge or standalone context?
    if merge:
        ctx = context.items()
        ctx.update(extra_context)
    else:
        ctx = extra_context

    return jinja2.Markup(template.render(ctx))

したがって、私のテンプレートは次のようになります。

{{ render("businesses.html", business) }}
于 2010-07-28T13:40:27.290 に答える