2016-05-02 29 views
1

Djangoテンプレートでは、一連の写真を繰り返して1つずつ表示しています。具体的には、今は6つのオブジェクトを含む1つの写真セットがあります。私はそうのように、これらの6つのオブジェクトを表示:ステートメントにreversedを追加Djangoテンプレートのforループを逆にして結果をスライスする方法

{% for pic in picstream.photo_set.all reversed %} 
    <img src="{{ pic.image_file.url }}"></img> 
{% endfor %} 

を所望の順序(最初のすなわち最新のIDS)で私に6オブジェクトを提供します。

次に、photo_setから4つ以下のオブジェクトを表示したいとします。これを達成するために|slice:":4"picstream.photo_set.allを追加しました。問題は、最初の2つのオブジェクトを切り捨てていることです。は私の望むorederingからです。それは後でがリストに最初を逆にする方法をされているべき、とスライス思わ

?パフォーマンスを低下させることなく、これを行う簡単な方法が必要です。代わりにforテンプレートタグのreversed引数を使用しての

+2

テンプレートシステムは、プログラムロジックではなく、プレゼンテーションを表現するためのものです。 –

+0

sliceがすべての構文をサポートしていれば、最初にクエリーセットを逆転してトップ4を得る '| slice:" :: - 1 "| slice:":4 "'のようなものを使うことができます。それが良い習慣であるかどうか、あるいはその効率についてさえも。 – AKS

+0

これはテンプレートに属していません。一方、| slice ':4'は、クエリセットオブジェクトがDjangoで評価されているため、データベースの最後に制限4のクエリが発生しますが、リストを逆にしても完全なクエリがトリガされ、あなたのdbとappサーバーの両方が不必要に。 –

答えて

4

、あなたは、クエリセット自体のreverse方法を使用することができます。

{% for pic in picstream.photo_set.all.reverse|slice:":4" %} 
    <img src="{{ pic.image_file.url }}"></img> 
{% endfor %} 

あなたはどこか、元の(非反転)クエリセットを評価している場合は、あなたのコードを入力すると、データベースにヒットする2番目のクエリが発生します。このような場合は、ロジックをビューコード自体またはテンプレートタグに移動する方がよいでしょう。

+1

'reverse'を使うためには、すでにクエリーセットまたはモデル自体のどちらかに順序付けを定義していなければなりません。それ以外の場合は効果がありません。最後の段落[ここ]を確認してください(https://docs.djangoproject.com/en/1.9/ref/models/querysets/#reverse) – AKS

+0

はい、確かです。私はモデル/クエリーセットレベルで定義されたいくつかのデフォルトの順序があると仮定しています。そうでなければ、OPはそれを逆にすることに興味がありません:-)。また、それがない場合でも、それはまだ動作します...ちょうどその順序は任意のいずれかの方法です。 – solarissmoke

関連する問題