13

たとえば、オブジェクトのリストが 2 つあり、foobar. Django テンプレートでは、 をループしている間foo、現在のインデックス/反復を追跡するカウンターがあり、そのカウンターは にアクセスするために使用されますbar。ここでの問題は、Django テンプレート システムが変数インデックスを使用したリストへのアクセスをサポートしているとは思わないことです。本当?もしそうなら、問題の回避策はありますか (ハードコードされたインデックスで同じ html/テンプレート コードを繰り返す以外に)?

コードのデモ:

{% for x in foo %}
  <span>{{ x.name }} vs. {{ bar.{{ forloop.counter0 }}.name }}</span>
{% endfor %}

Django テンプレートが気に入らない{{ bar.{{ forloop.counter0 }}.name }}

注:Django 1.4を使用しています

4

2 に答える 2

11

Django テンプレートがこれを直接許可していないことは正しいです。これは、Django がほぼすべてのプレゼンテーション ロジックをビューに配置することを強制しようとするためです。あなたの最良の選択肢は、ビューのコンテキストで辞書のリストを作成することです。これにより、それを繰り返し、名前でメンバーにアクセスできます。または:

  • zipそれらを辞書にする代わりに一緒にリストを作成し、 を使用してそれらにアクセスします{% for fooItem, barItem in zippedList %}
  • Jinja2のような制限の少ないテンプレート言語を使用する
  • Yuji Tomita の提案に従って、カスタム テンプレート フィルターを使用する
于 2012-12-07T21:40:10.443 に答える
5

そうです、変数名を解決できません。このロジックをビューに配置するために、間違いなく非常に懸命に努力してください。

しかし、5% の確率で、ビューにあまりにも多くのロジックが必要になったり、テンプレートの作成者が制御できない変更が必要になったりすると、これが非常に制限的であることがわかります。私はいくつかの個人的なカスタマイズを受け入れるようになり、ビュー内での変数の割り当てと単純な変数の解決を可能にしました。

ただし、「すべてのルックアップを 1 つの」システム (インデックス、属性、キー) で行うテンプレート エンジンを使用して、そのようなテンプレート タグを作成するのは非常に簡単です。

from django.template import Variable, VariableDoesNotExist

@register.assignment_tag()
def resolve(lookup, target):
    try:
        return Variable(lookup).resolve(target)
    except VariableDoesNotExist:
        return None

{% resolve some_list some_index as value %}
{% resolve some_dict some_dict_key as value %}
于 2012-12-07T21:45:37.227 に答える