web-dev-qa-db-ja.com

Djangoテンプレートのクエリセットオブジェクトにアクセスする

HumanおよびAnimalという名前の2つのモデルがあります。人間の主キーは、動物モデルの外部キーです。どちらもそれぞれ3列です。人間モデルには、c、e、r列があります。動物モデルには、l、i、p列があります。このように、HumanモデルでDjangoクエリを実行しています。

result = Human.objects.filter().order_by('r')

resultはクエリセットオブジェクトです。このオブジェクトはビューファイルからDjangoテンプレートページに送信されます。テンプレートページ内では、resultをループして列の値を表示しています。

次に、同じループ内のDjangoテンプレート内で、p列(動物モデルに存在する)列の値もフェッチします。 Djangoテンプレートページでどのように実行できますか?.

pythonファイルで、私はこのようにすることができます

for i in result:
    print i.animal_set.values()[0]['p']

しかし、私はテンプレートページでそれをしたいです。

19
sandeep
{% for record in result %}
    {{record.c}}, {{record.e}}, 
    {% for animal in record.animal_set|slice:":1" %}
        {{animal.p}}
    {% endfor %}
{% endfor %}
22
Aamir Adnan

まず、データベーススキーマに問題があるようです。 「c」、「e」、「r」などが列の実際の名前である場合は、名前を変更することを検討してください。次に、例のPython=コードで示したコードでは、IndexErrorsはキャッチされません。Humanオブジェクトに関連する最初のAnimalを取得したい場合は、getterメソッドを人間モデル:

def get_first_animal(self):
  try:
    return self.animal_set[0]
  except IndexError:
    return None

テンプレートからすべての動物を表示する必要がある場合は、次のようなことを試すことができます。

{% for animal in human.animal_set.all %}
{{ animal }}
{% endfor %}

与えられた変数名は異なりますが、あなたの場合、コードをリファクタリングするのが良いでしょう。

4
Jordan Jambazov