gpt4 book ai didi

django - Django 模板中的计数方法未按预期工作

转载 作者:行者123 更新时间:2023-12-04 00:36:16 25 4
gpt4 key购买 nike

我正在构建一个新闻应用程序,允许成员(member)对文章发表评论。我想在我的模板中显示文章,并显示对每篇文章发表的评论数。我尝试使用计数方法,但它检索的是评论表中的评论总数,而不是特定文章的评论数。

#models.py
class Article(models.Model):
#auto-generate indices for our options
ENTRY_STATUS = enumerate(('no', 'yes'))
#this will be a foreign key once account app is built
author = models.CharField(default=1, max_length=1)
category = models.ForeignKey(Category)
title = models.CharField(max_length=50)
entry = models.TextField()
dateposted = models.DateTimeField(default=timezone.now, auto_now_add=True)
draft = models.IntegerField(choices=ENTRY_STATUS, default=0)
lastupdated = models.DateTimeField(default=timezone.now, auto_now=True)

#prevents the generic labeling of our class as 'Classname object'
def __unicode__(self):
return self.title


class Comment(models.Model):
#this will be a foreign key once account app is built
author = models.CharField(default=1, max_length=1)
article = models.ForeignKey(Article)
dateposted = models.DateTimeField(auto_now_add=True)
comment = models.TextField()

def __unicode__(self):
#returns the dateposted as a unicode string
return unicode(self.dateposted)

#templates/list_articles.html
{% for comment in comments %}
{% if comment.article_id == article.id %}
{% if comments.count < 2 %}
#this is returning all comments in comment table
<b>{{ comments.count }} comment</b>
{% else %}
<b>{{ comments.count }} comments</b>
{% endif %}
{% endif %}
{% endfor %}

到目前为止我看到的所有示例都手动提供了一个过滤依据的值(例如 Comment.objects.filter(article_id=x).count() )在我的例子中我只能访问通过模板。

#views.py
class ArticlesListView(ListView):
context_object_name = 'articles'
# only display published pieces (limit 5)
queryset = Article.objects.select_related().order_by('-dateposted').filter(draft=0)[:5]
template_name = 'news/list_articles.html'

# overide this to pass additional context to templates
def get_context_data(self, **kwargs):
context = super(ArticlesListView, self).get_context_data(**kwargs)
#get all comments
context['comments'] = Comment.objects.order_by('-dateposted')
#get all article photos
context['photos'] = Photo.objects.all()
#context['total_comments'] = Comment.objects.filter(article_id=Article)
return context

我的预期结果是列出所有文章,并在每篇文章下方汇总对该文章发表的评论(例如,第 1 条:4 条评论,第 5 条:1 条评论,等等)现在我'得到:第 1 条:4 条评论,第 5 条:4 条评论(即使第 5 条只有 1 条评论)

感谢任何帮助。我花了 5 个小时通读文档,但每个示例都手动提供了一个过滤依据的值。

最佳答案

我不确定您为什么觉得这出乎意料。 comments所有的评论,所以comments.count当然是所有评论的计数。不然怎么可能呢?您不会在任何地方过滤它们。

然而,这是一种非常糟糕的做事方式。绝对没有理由将所有评论传递给模板,然后遍历它们以检查它们是否是正确的文章。你有一个从 Comment 到 Article 的外键,所以你应该使用反向关系来获取相关的评论。

从您的 View 中完全删除 Comment 查询,并在您的模板中执行此操作(替换整个嵌套 for 和 if block ):

{{ article.comment_set.count }}

然而,这对每篇文章进行一次计数查询。更好的解决方案是使用注释,这样您就可以在一个查询中完成所有操作。更改您的查询集以添加相关评论的注释计数:

from django.db.models import Count

class ArticlesListView(ListView):
queryset = Article.objects.select_related().annotate(comment_count=Count('comments')).order_by('-dateposted').filter(draft=0)

现在你可以做

{{ article.comment_count }}

关于django - Django 模板中的计数方法未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24117491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com