【问题标题】:django template - for loop date display with slicedjango 模板 - 带切片的循环日期显示
【发布时间】:2014-03-18 02:36:11
【问题描述】:

我有一个 django 1.4.6 项目。我试图在我的模板中显示我的博客条目,这些条目在未来没有过时,所以我在我的 models.py 页面中拼凑了这段代码,它可以工作:

    #if the blog is post/future dated, do not display the blog entry.
    @property
    def is_past_date_published_blog(self):
        if self.blog_post_date_published < date.today():
            return True
        return False

现在我只想显示前 3 个博客条目(我有超过 10 个博客条目),所以我使用了 slice:3 如下所示:

            {% for blog_post in blog_posts|slice:":3" %}
                {% if blog_post.is_past_date_published_blog %}
                    .......
                    .......
                 {% endif %}
            {% endfor %}

但是,这只会显示两个条目,因为循环确实会计算内部 if 条件未包含的博客条目。我试图将 for 循环放在 if 语句中,但这不起作用。我现在被难住了。

如何编写这段代码来显示今天日期之前的三个博客条目?

【问题讨论】:

    标签: django date if-statement for-loop


    【解决方案1】:

    Don't put too much logic in the template:

    我们的目标不是发明一种编程语言。目标是提供 足够的编程式功能,例如分支和 循环,这对于做出与演示相关的决策至关重要。

    而且您描述的任务根本与演示无关。

    过滤掉视图中未标注未来日期的博客条目,并将其传递给模板。例如:

    blog_posts = BlogPost.objects.filter(blog_post_date_published__lt=datetime.today())[:3]
    

    然后,在模板中,循环浏览您之前过滤的这些博客文章:

    {% for blog_post in blog_posts %}
        # display a blog post
    {% endfor %}
    

    希望对您有所帮助。

    【讨论】:

    • 谢谢alecxe。这是一个很好的答案 - 非常有用。
    • 哦,对了,如果有初学者想用这段代码,别忘了在views.py页头import from datetime import datetime。
    【解决方案2】:

    您可以从您的视图中传递仅在今天之前发布的博客文章,然后像现在一样使用|slice:":3" 以仅显示三个。在视图中操作数据比在模板中更容易

    另一种方法是在模板中设置一个计数器变量,该变量在内部 if 条件内递增,但不鼓励在模板中更改任何数据。

    【讨论】:

      猜你喜欢
      • 2017-09-22
      • 2013-04-30
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2015-02-05
      • 2018-11-17
      • 1970-01-01
      • 2017-03-27
      相关资源
      最近更新 更多