各選択肢が獲得した投票数を印刷したいと思います。テンプレートにこのコードがあります:
{% for choice in choices %}
{{choice.choice}} - {{votes[choice.id]}} <br />
{% endfor %}
votes
は単なる辞書ですが、choices
はモデルオブジェクトです。
次のメッセージで例外が発生します。
"Could not parse the remainder"
ジェフのコメントをエコー/拡張するために、あなたが目指すべきだと思うのは、そのオブジェクトに関連付けられた投票数を計算する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のテンプレートの目標は、テンプレート内のコードからユーザーを隔離することであり、その逆も同様です。
上記の方法を試して、プロパティを事前にキャッシュしてプロパティのサブセレクトを作成するか、繰り返し/オン-要求はクエリを実行して投票数を計算します。しかし、それがひどいクエリを生成する場合、自分で収集したデータをビューのプロパティに常に入力できます。
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テンプレート内のディクショナリを反復処理できます。
ドット表記を使用できます。
ドットルックアップは、次のように要約できます。テンプレートシステムは、変数名にドットを検出すると、次のルックアップをこの順序で試行します。
- 辞書検索(例:foo ["bar"])
- 属性検索(例:foo.bar)
- メソッド呼び出し(例:foo.bar())
- リストインデックスルックアップ(例:foo [2])
システムは、動作する最初のルックアップタイプを使用します。短絡論理です。
here などの「get」テンプレートタグを見つける(または定義する)必要があります。
タグ定義:
@register.filter
def hash(h, key):
return h[key]
そして、それは次のように使用されます:
{% for o in objects %}
<li>{{ dictionary|hash:o.id }}</li>
{% endfor %}
辞書アイテムを使用する
{% for key, value in my_dictionay.items %}
<li>{{ key }} : {{ value }}</li>
{% endfor %}
Django_template_filter フィルター名get_value_from_dict
{{ your_dict|get_value_from_dict:your_key }}
@russian_spyによる回答と同様:
<ul>
{% for choice in choices.items %}
<li>{{choice.0}} - {{choice.1}}</li>
{% endfor %}
</ul>
これは、より複雑な辞書を分解するのに適している場合があります。
理想的には、投票で自分自身を見つけた選択肢オブジェクトにメソッドを作成するか、モデル間の関係を作成します。辞書検索を実行したテンプレートタグも機能します。