配列 - python 辞書




どのようにDjangoテンプレートの辞書要素にアクセスするには? (6)

@russian_spyの回答と同様です:

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

これは、より複雑な辞書を分解するのに適しているかもしれません。

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

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

このメッセージで例外が発生します。「残りを解析できませんでした」


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 %}

テンプレートタグは、IMHOではこのソリューションにとっては少し過剰ですが、ひどい解決策でもありません。 Djangoのテンプレートの目的は、テンプレート内のコードからあなたを隔離することです。逆もまた同様です。

私は上記の方法を試してみて、ORMが生成するSQLを見てみましょう。なぜなら、プロパティをプリキャッシュしてプロパティのサブセレクトを作成したり、繰り返し/投票数を計算するためにクエリを実行することを要求する。 しかし、厄介なクエリが生成された場合は、自分で収集したデータを表示することができます。



ドット表記を使用することができます:

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

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

システムは、最初に動作する検索タイプを使用します。 これは短絡ロジックです。


辞書項目を使用する

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

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

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

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

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





django