web-dev-qa-db-ja.com

django forループカウンターブレーク

これはうまくいけば迅速で簡単なものです。カスタムテンプレートタグを使用してこれを回避する方法を知っていますが、他に見落としていた方法があるかどうか興味がありました。ブログ用にある種のギャラリー機能を作成しました。すべてのギャラリーにページを表示するギャラリーリストページがあります。さて、そのリストにある各ギャラリーのすべての写真を表示したくはありません。各ギャラリーに20枚の画像がある場合、5つの投稿でページ付けすると、1ページに100枚の画像が表示されるからです。それは無駄であり、物事を進めるための間違った方法です。

私が持っている質問は、写真セットから3枚の写真を表示する方法はありますか?私がやりたいのですが、私はしませんthink可能です(擬似コード)のようなものです:

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

ドキュメントから判断すると、完全に見逃していない限り、テンプレートシステムでは不可能です。したがって、それを回避するために、ある種の独自のテンプレートタグを書くことができます。私はおそらく視点の観点から何かをすることができましたが、私はその考えを深く調べていませんでした。私が持っている他のオプションは、モデルにプレビューフィールドを与え、ユーザーがプレビューフィールドで必要な写真を選択できるようにすることです。

とにかく、いくつかの異なるオプションがあるので、私はあなたがそれをどのように行うかを見るために聴衆をポーリングすると思いました。ご意見をいただければ幸いです。個人的には、この猫の皮を剥ぐ方法はたくさんあります。

26
f4nt

使用する:

{% for photos in gallery.photo_set|slice:":3" %}
76
Alex Martelli

これは、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]
1
S.Lott