【问题标题】:Django Templates Display The Latest 3 CommentsDjango 模板显示最新的 3 条评论
【发布时间】:2021-02-13 21:42:46
【问题描述】:

我在 django 中有这段代码,对于每个 django 注释,都执行 for 循环内的任何操作:

{% for comment in post.comments.all %}

{% endfor %}

这段代码,对于每条评论,都会执行 for 中的任何内容。要计算我使用的 cmets:

{{ post.comments.count }}

如果您需要,这是我的评论模型:

class Comment(models.Model):
    post = models.ForeignKey('blog.Post', on_delete=models.CASCADE, related_name='comments')
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    text = models.TextField(default='')
    created_date = models.DateTimeField(default=timezone.now)
    anonymous = models.BooleanField(default=False)

    def approve(self):
        self.approved_comment = True
        self.save()

    def __str__(self):
        return self.text

现在,我想将它们组合在一起,因此它只显示最新的 3 个 cmets,并且只运行 for 循环 3 次或更少。 (请注意,我想在模板中完成所有这些工作,而不是在 views.py 文件中)

【问题讨论】:

  • 你能分享你的评论模型吗? cmets是否默认按发布日期排序?
  • 当然,我会分享它。是的,这些 cmets 是按发布日期排序的。
  • 您应该在视图中执行此操作。这不是高性能的。对于快速模板解决方案,您可以尝试{% for comment in post.comments.all|slice:":3" %}
  • @hansTheFranz,是的,我知道我可能应该在 views.py 文件中执行此操作,但我有几个原因无法将其放入 views 文件中。

标签: python django for-loop if-statement


【解决方案1】:

默认情况下,您可以按创建日期订购 cmets:

from django.conf import settings

class Comment(models.Model):
    post = models.ForeignKey(
        'blog.Post',
        on_delete=models.CASCADE,
        related_name='comments'
    )
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
    text = models.TextField(default='')
    created_date = models.DateTimeField(auto_now_add=True)
    anonymous = models.BooleanField(default=False)

    class Meta:
        ordering = ['-created_date']

    # …

然后您可以使用|slice template filter [Django-doc] 对查询集进行切片:

{% for comment in post.comments.all|slice:':3' %}

{% endfor %}

注意:通常使用settings.AUTH_USER_MODEL [Django-doc] 引用用户模型比直接使用User model [Django-doc] 更好。更多信息可以查看referencing the User model section of the documentation

然而,最好预取视图中的元素,使用:

Post.objects<b>.prefetch_related('comments')</b>

这将获取 bulk 中的 cmets,这比运行查询 per Post object 更有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多