回答:
Jeffのコメントをエコー/拡張するために、あなたが目指すべきことは、そのオブジェクトに関連付けられた投票数を計算する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のテンプレートの目的は、テンプレート内のコードからユーザーを隔離すること、およびその逆です。
上記の方法を試して、ORMが生成するSQLを確認します。プロパティを事前にキャッシュしてプロパティの副選択を作成するのか、それとも反復的/オンになるのかがわからないためです。クエリを実行して投票数を計算します。しかし、それがひどいクエリを生成する場合は、自分で収集したデータをビューのプロパティに常に入力できます。
.items
(他の回答の1つに示されているように)呼び出しと組み合わされた、より構造化された辞書は、はるかに単純なソリューションです。
choices = {'key1':'val1', 'key2':'val2'}
テンプレートは次のとおりです。
<ul>
{% for key, value in choices.items %}
<li>{{key}} - {{value}}</li>
{% endfor %}
</ul>
基本的に.items
は(key, value)
、Pythonメソッドと同様に、辞書をペアのリストに分割するDjangoキーワードです.items()
。これにより、Djangoテンプレートのディクショナリを反復できます。
items
Djangoキーワードではなく、辞書に対するPythonメソッド呼び出しです。アレックスマルテッリは指摘し、それは基本的に同じですiteritems
。ウィルヘルムが答えたように、ドットルックアップでは、辞書ルックアップが3番目に優先されます。辞書内にという名前のアイテムがある場合'items'
、タプルのリストではなく、その値が返されます。テストするには:{'items':'oops'}
辞書に追加すると、「oops」という単語からの箇条書きの文字リストが表示されます
ドット表記を使用できます。
ドットルックアップは次のように要約できます。テンプレートシステムが変数名にドットを検出すると、次のルックアップをこの順序で試行します。
- 辞書検索(例:foo ["bar"])
- 属性の検索(例:foo.bar)
- メソッド呼び出し(例:foo.bar())
- リストインデックスの検索(例:foo [2])
システムは、機能する最初の検索タイプを使用します。それは短絡論理です。
my_dict[1][2]
テンプレートコード:my_dict.1.2
d.key.1
番目に注意してください.
辞書アイテムを使用:
{% 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 }}