Django 中 for 循环计数器中断

30 投票
2 回答
31060 浏览
提问于 2025-04-15 12:14

希望这个问题能简单快速地解决。我知道可以通过自定义模板标签来解决这个问题,但我想知道还有没有其他我可能忽略的方法。我为我的博客创建了一个类似画廊的功能,并且有一个画廊列表页面,可以分页显示我所有的画廊。现在,我不想在这个列表中显示每个画廊的所有照片,因为如果每个画廊有20张图片,那在每页显示5个帖子时,就会有100张图片。这太浪费了,而且处理方式也不对。

我想问的是,有没有办法只显示3张照片?我想做的事情,但我觉得可能不行,类似于(伪代码):

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

根据文档来看,除非我完全搞错了,不然通过模板系统是无法做到的。因此,我可以写一个自己的模板标签来解决这个问题。我可能也可以从视图的角度来做,但我还没有深入研究这个想法。另一个选择是给模型添加一个预览字段,让用户选择他们想在预览字段中显示的照片。

总之,有几种不同的选择,所以我想问问大家你们会怎么做。任何意见都很受欢迎。就我个人而言,我很高兴有这么多种方法来解决这个问题。

2 个回答

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]
86

使用:

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

撰写回答