【问题标题】:django for loop counter breakdjango for 循环计数器中断
【发布时间】:2010-11-02 19:06:21
【问题描述】:

希望这是一个快速/简单的。我知道一种通过自定义模板标签解决此问题的方法,但我很好奇是否还有其他方法我正在寻找。我为我的博客创建了一个画廊功能,并且我有一个画廊列表页面,可以对我的所有画廊进行分页。现在,我不想在该列表中显示每个画廊的所有照片,因为如果每个画廊甚至有 20 张图片,那么如果我在 5 个帖子处分页,那么一页上就有 100 张图片。那会很浪费,而且是错误的处理方式。

我的问题是,有没有办法只显示照片集中的 3 张照片?我想做,但我不认为可能是(伪代码):

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

从文档来看,除非我完全错过它,否则通过模板系统是不可能的。因此,我可以编写自己的模板标签来解决它。我可能可以从视图方面做一些事情,但我并没有深入研究这个想法。我的另一个选项是给模型一个预览字段,并允许用户在预览字段中选择他们想要的照片。

无论如何,有几个不同的选择,所以我想我会调查观众,看看你会怎么做。任何意见表示赞赏。就个人而言,很高兴有很多方法可以剥这只猫的皮。

【问题讨论】:

    标签: python django for-loop


    【解决方案1】:

    用途:

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

    【讨论】:

    • 所以,有我所有的选择,然后是我一直忽略的明显的选择。感谢您的提示,为我省去了很多麻烦!
    • 使用切片过滤器还有一个额外的好处。如果您传入 Django QuerySet(而不是集合),则切片将流向底层 SQL 查询,从而限制页面实际从数据库中检索的行数。
    • @Dave,+1:谢谢,我不知道那个优化——太棒了!
    【解决方案2】:

    这在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]
    

    【讨论】:

    • 其实,既然3和模板里的展示有关,其他模板可能空间比较大,想展示4张照片,不是吗?
    • @Noio:将照片分组到列表列表中应该在视图功能中。该模板只获取列表列表并显示它们。
    • 很奇怪,你告诉他不要在模板中“硬编码”一个常量,然后在服务器代码中提供一个相同常量的示例。这是一个糟糕的建议 - 模板正是您想要放置可能会根据设计更改而更改的变量的位置。
    • @Will Merydith:对不起。我不同意。以我的经验,模板可以(并且应该)是通用的,视图函数可以包含奇怪的常量。通常来自设置文件的常量。
    • 必须同意这里的其他人。模板就是这个地方。如果您担心重复,请创建一点 HTML 作为包含,但设计通常取决于这样的事情。假设设计字面上只有 3 的空间。模板通常会清楚地表明您无法容纳更多,而视图则更抽象。如果有人稍后过来并决定将视图更改为显示 5,那么它可能会破坏模板。
    猜你喜欢
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多