2009-08-14 20 views
138

私はテンプレートにこのコードを書いています。これは、それぞれの選択肢が得た投票数を出力したいと思います。投票はちょうど辞書ですが、選択はモデルオブジェクトです。djangoテンプレートの辞書要素にアクセスするには?

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

は、それがこのメッセージ「残りを解析できませんでした」あなたはhere、例えば、「取得」テンプレートタグを見つける(または定義)する必要があります

答えて

47

は、単にそのオブジェクトに関連付けられた票の数を計算し、あなたの選択のクラスのプロパティです:あなたのテンプレートで

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を見てみましょう。プロパティをプリキャッシュし、そのプロパティのサブセレクトを作成すると、私の頭の上からわかりません。反復的に/オンデマンドで投票数を計算するためにクエリを実行します。しかし、厄介なクエリが生成された場合は、自分で収集したデータを表示することができます。

+0

おかげで検討し、あなたのソリューションは、私のために働きました。私はdjangoとpythonの初心者であり、ORMが生成したSQLを取得する方法を理解することはできません。 – Mohamed

+0

あなたはそのビットの答えをここで見つけることができます: http://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django -is-running これは非常にシンプルで、実際にはあなたのテンプレートに表示することも、ロギング機能を使ってログに記録することもできますが、DEBUGを有効にすることを忘れないでください。 –

+0

このソリューションは、私がdjangoテンプレート+ Googleのアプリケーションエンジンモデルを持っていた問題に最適です。私はあなたに二度投票してもらいたい。 –

15

と例外が発生します。

タグ定義:

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

そして、それはのように使われています:理想的には

{% for o in objects %} 
    <li>{{ dictionary|hash:o.id }}</li> 
{% endfor %} 
+1

は 'h.get(キー、 'DEFAULT_VALUE')エワート@ジョン'ためKeyError例外の – semiomant

3

は、あなたが投票で自分自身を発見した選択オブジェクトのメソッドを作成するか、または関係を作成しますモデル。辞書ルックアップを実行したテンプレートタグも機能します。私はあなたが目指すべきだと思うものを/ジェフのコメント時に拡張エコー

141

あなたは、ドット表記を使用することができます。

ドットルックアップは 次のように要約することができます :変数名にドットが発生した テンプレートシステム、 はそれが この順序で、以下の検索をしようとしたとき:

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

システムが動作する第1のルックアップタイプ を使用します。これは短絡ロジックです。

+38

彼の場合、選択肢は変数です。 .choiceを実行すると、キー選択の値ではなく、キー "choice"の値が検索されます。 – ibz

+0

+1は、質問は「私が思っていることを推測する」質問のようなものでしたが、情報について+1しました。ウィルヘルムに感謝します。 – eficker

+1

これはネストされた辞書でも機能します。 Pythonコード: 'my_dict [1] [2]' テンプレートコード: 'my_dict.1.2' – djsmith

216
choices = {'key1':'val1', 'key2':'val2'} 

ここではテンプレートです:

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

基本的には、.itemsは(キー、値)ペアのリストに辞書を分割Djangoのキーワードです。これにより、Djangoテンプレートのディクショナリに対する反復が可能になります。

+16

.items - あなたはちょうど私の問題を解決しました。 –

+2

それは私のために働かなかった。 – anacarolinats

+0

@anacarolinats(と他の人)は、選択肢のキーの両方の値を繰り返し処理することを確認します。それでも動作するはずです。 – OldTinfoil

2

django_template_filter フィルタ名get_value_from_dict @russian_spyによって答えと同様に

{{ your_dict|get_value_from_dict:your_key }} 
2

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

これは、より複雑な辞書を破壊するために適しているかもしれません。

0

使用辞書項目

 {% for key, value in my_dictionay.items %} 
      <li>{{ key }} : {{ value }}</li> 
     {% endfor %} 
関連する問題