2009-06-14 6 views
25

これはうまくいけば素早く簡単です。私はカスタムテンプレートタグを使ってこれを回避する方法を知っていますが、私が見ていた他の方法があるのか​​不思議でした。ブログのためのギャラリー機能を作成しました。ギャラリーのページにはすべてのギャラリーがページされています。今度は、各ギャラリーに20枚の画像があっても、5枚のページにページを貼ると100枚の画像が表示されるので、そのギャラリーのすべての写真をそのリストに表示する必要はありません。それは無駄だし、物事については間違ったやり方だ。django forループカウンタブレーク

質問には、写真セットから3枚の写真を表示する方法がありますか?私は何をしたいのですが、私はが可能であるとは思わないこと(擬似コード)のようなものされています、それはを介して可能

{% for photos in gallery.photo_set %} 
    {% if forloop.counter lt 3 %} 
    <img src="{{ photos.url }}"> 
    {% endif %} 
{% endfor %} 

私はそれを完全に欠けている場合を除き、文書から判断ではありませんテンプレートシステム。したがって、私はそれを回避するための独自のテンプレートタグを書くことができます。私はおそらくビューの側面から何かをすることができますが、私はその考え方に遠慮していません。私が持っているもう1つの選択肢は、モデルにプレビューフィールドを与え、プレビューフィールドで必要な写真をユーザーが選択できるようにすることです。

とにかく、いくつかのオプションがあるので、私はあなたがそれをやる方法を見るために聴衆に投票したいと思った。どの意見もありがとうございます。個人的には、この猫をスキンケアする方法はたくさんあります。

答えて

69

用途:

{% for photos in gallery.photo_set|slice:":3" %} 
+2

私のすべての選択肢があります。そして、私が見落としているあなたの大変明白なものがあります。先端のおかげで、私にトラブルのトンを節約! – f4nt

+3

スライスフィルタを使用することには別の利点があります。 Django QuerySetを渡す場合(コレクションではなく)、スライスは基本的なSQLクエリに流れ込み、ページがデータベースから取得する行数を制限します。 –

+0

@Dave、+1:ありがとう、私はその最適化について知りませんでした - クール! –

1

これはgallery.photo_setコレクションで行う方がよいです。テンプレートのハードコードされた "3"は長期的には悪い考えです。

class Gallery(object): 
    def photo_subset(self): 
     return Photo.objects.filter(gallery_id = self.id)[:3] 

ビュー機能では、3枚のランダム写真または3枚の最新の写真を選択することができます。

def photo_recent(self): 
     return Photo.objects.filter(gallery_id = self.id).orderby(someDate)[:3] 

    def photo_random(self): 
     pix = Photo.objects.filter(gallery_id = self.id).all() 
     random.shuffle(pix) 
     return pix[:3] 
+0

実際には、3はテンプレートに収まるプレゼンテーションと関係があるので、他のテンプレートはより多くのスペースを持ち、4枚の写真を表示したいのですが、いいえ? – noio

+0

@Noio:リストのリストに写真をグループ化するには、ビュー機能が必要です。テンプレートはリストのリストを取り出し、表示します。 –

+1

あなたはテンプレートに定数を「ハードコード」しないように言っていますが、サーバーコードに同じ定数の例を提供することはおかしなことです。これはひどいアドバイスです。テンプレートは、デザインの変更に基づいて変更される可能性のある変数を配置する場所です。 –

関連する問題