1. ホーム
  2. python

[解決済み] Django テンプレートで辞書要素にアクセスする方法は?

2022-02-17 08:27:37

質問

各選択肢の得票数を表示したいのですが。以下のコードをテンプレートに記述しています。

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

votes は単なる辞書であるのに対し choices はモデルオブジェクトです。

このメッセージとともに例外を発生させます。

"Could not parse the remainder"

解決方法は?

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がプロパティを事前にキャッシュして、プロパティのサブセレクトを作成するだけなのか、投票数を計算するためにクエリを繰り返し/オンデマンドで実行するのか、私の頭では分からないので、上記の方法を試して、ORMがどんなSQLを生成するか見てみたいと思います。しかし、非道なクエリを生成するのであれば、自分で収集したデータでビューのプロパティに常に入力することができます。