ビュー内の Python コードに相当するオブジェクトのセットを取得するには、django テンプレート内からフィルター処理されたクエリを実行する必要があります。
queryset = Modelclass.objects.filter(somekey=foo)
私のテンプレートでやりたいこと
{% for object in data.somekey_set.FILTER %}
しかし、FILTERの書き方がわからないようです。
ビュー内の Python コードに相当するオブジェクトのセットを取得するには、django テンプレート内からフィルター処理されたクエリを実行する必要があります。
queryset = Modelclass.objects.filter(somekey=foo)
私のテンプレートでやりたいこと
{% for object in data.somekey_set.FILTER %}
しかし、FILTERの書き方がわからないようです。
設計上、これを行うことはできません。Django フレームワークの作成者は、プレゼンテーション コードをデータ ロジックから厳密に分離することを意図していました。モデルのフィルタリングはデータ ロジックであり、HTML の出力はプレゼンテーション ロジックです。
したがって、いくつかのオプションがあります。最も簡単な方法は、フィルタリングを行ってから、結果を に渡すことrender_to_response
です。または、モデルにメソッドを記述して、 と言うことができます{% for object in data.filtered_set %}
。最後に、独自のテンプレート タグを作成することもできますが、この特定のケースでは使用しないことをお勧めします。
私は定期的にこの問題に遭遇し、「メソッドの追加」ソリューションをよく使用します。ただし、「メソッドを追加する」または「ビューで計算する」が機能しない (またはうまく機能しない) 場合が確実に存在します。たとえば、テンプレート フラグメントをキャッシュしていて、それを生成するために重要な DB 計算が必要な場合などです。必要でない限り、DB の作業を行いたくありませんが、テンプレート ロジックを深く理解するまで、必要があるかどうかはわかりません。
その他の可能な解決策:
http://www.djangosnippets.org/snippets/9/にある {% expr <expression> as <var_name> %} テンプレート タグを使用してください。式は、テンプレートのコンテキストをローカル スコープとする有効な Python 式です。
テンプレート プロセッサを変更します。Jinja2 ( http://jinja.pocoo.org/2/ ) の構文は Django テンプレート言語とほぼ同じですが、完全な Python 機能を利用できます。また、高速です。これを大規模に行うことも、作業中のテンプレートに使用を制限することもできますが、デザイナーが管理するページには Django の「より安全な」テンプレートを使用してください。
もう 1 つのオプションは、常に適用したいフィルターがある場合、問題のモデルにカスタム マネージャーを追加して、返される結果にフィルターを常に適用することです。
これの良い例はEvent
モデルです。モデルに対して実行するクエリの 90% で、 のようなものが必要になりEvent.objects.filter(date__gte=now)
ます。つまり、通常は関心のEvents
あるものに近づきます。これは次のようになります。
class EventManager(models.Manager):
def get_query_set(self):
now = datetime.now()
return super(EventManager,self).get_query_set().filter(date__gte=now)
そしてモデルでは:
class Event(models.Model):
...
objects = EventManager()
しかし、繰り返しますが、これはモデルで実行されるすべての既定のクエリに対して同じフィルターを適用するEvent
ため、上記の手法の一部ほど柔軟ではありません。
これは、割り当てタグで解決できます。
from django import template
register = template.Library()
@register.assignment_tag
def query(qs, **kwargs):
""" template tag which allows queryset filtering. Usage:
{% query books author=author as mybooks %}
{% for book in mybooks %}
...
{% endfor %}
"""
return qs.filter(**kwargs)
編集: assignment_tagはDjango 2.0で削除されましたが、これは機能しなくなります。