web-dev-qa-db-ja.com

Djangoテンプレートの辞書要素にアクセスする方法は?

各選択肢が獲得した投票数を印刷したいと思います。テンプレートにこのコードがあります:

{% for choice in choices %}
    {{choice.choice}} - {{votes[choice.id]}} <br />
{% endfor %}

votesは単なる辞書ですが、choicesはモデルオブジェクトです。

次のメッセージで例外が発生します。

"Could not parse the remainder"
163
Mohamed

ジェフのコメントをエコー/拡張するために、あなたが目指すべきだと思うのは、そのオブジェクトに関連付けられた投票数を計算するChoiceクラスのプロパティです。

    class Choice(models.Model):
        text = models.CharField(max_length=200) 

        def calculateVotes(self):
            return Vote.objects.filter(choice = self).count()

        votes = property(calculateVotes)

次に、テンプレートで次のことができます。

    {% for choice in choices %}
            {{choice.choice}} - {{choice.votes}} <br />
    {% endfor %}

テンプレートタグは、このソリューションにとってはやややり過ぎですが、ひどいソリューションでもありません。 Djangoのテンプレートの目標は、テンプレート内のコードからユーザーを隔離することであり、その逆も同様です。

上記の方法を試して、プロパティを事前にキャッシュしてプロパティのサブセレクトを作成するか、繰り返し/オン-要求はクエリを実行して投票数を計算します。しかし、それがひどいクエリを生成する場合、自分で収集したデータをビューのプロパティに常に入力できます。

60
John Ewart
choices = {'key1':'val1', 'key2':'val2'}

テンプレートは次のとおりです。

<ul>
{% for key, value in choices.items %} 
  <li>{{key}} - {{value}}</li>
{% endfor %}
</ul>

基本的に、.itemsはDjangoキーワードであり、Pythonメソッド.items()と同様に、辞書を(key, value)ペアのリストに分割します。これにより、Djangoテンプレート内のディクショナリを反復処理できます。

258
russian_spy

ドット表記を使用できます。

ドットルックアップは、次のように要約できます。テンプレートシステムは、変数名にドットを検出すると、次のルックアップをこの順序で試行します。

  • 辞書検索(例:foo ["bar"])
  • 属性検索(例:foo.bar)
  • メソッド呼び出し(例:foo.bar())
  • リストインデックスルックアップ(例:foo [2])

システムは、動作する最初のルックアップタイプを使用します。短絡論理です。

167
Wilhelm

here などの「get」テンプレートタグを見つける(または定義する)必要があります。

タグ定義:

@register.filter
def hash(h, key):
    return h[key]

そして、それは次のように使用されます:

{% for o in objects %}
  <li>{{ dictionary|hash:o.id }}</li>
{% endfor %}
21
Ned Batchelder

辞書アイテムを使用する

        {% for key, value in my_dictionay.items %}
          <li>{{ key }} : {{ value }}</li>
        {% endfor %}
6

Django_template_filter フィルター名get_value_from_dict

{{ your_dict|get_value_from_dict:your_key }}
5
Nick Korolkov

@russian_spyによる回答と同様:

<ul>
{% for choice in choices.items %} 
  <li>{{choice.0}} - {{choice.1}}</li>
{% endfor %}
</ul>

これは、より複雑な辞書を分解するのに適している場合があります。

4
Adam Starrh

理想的には、投票で自分自身を見つけた選択肢オブジェクトにメソッドを作成するか、モデル間の関係を作成します。辞書検索を実行したテンプレートタグも機能します。

3
Jeff Ober