我开始学习Django,我决定创建一个博客来检查我的技能,并通过一个实际的项目来训练自己。在我的models.py中有两个模型:
class Article (models.Model):
title = models.CharField(max_length = 100)
author = models.CharField(max_length = 100)
date = models.DateField(auto_now=True)
content = models.TextField()
is_draft = models.BooleanField(default = True)
def __str__(self):
return self.title
class Comment(models.Model):
comment_author = models.CharField(max_length = 100)
comment = models.TextField()
article = models.ForeignKey(Article,on_delete=models.CASCADE)
def __str__(self):
return self.comment_author
我想要显示所有文章的标题和内容以及评论的数量,为此我使用了ListView。views.py:
class ArticleListView (ListView):
context_object_name = 'articles'
model = models.Article
# print(models.Article.objects.get(pk=1).models.Comment_set.all())
def get_context_data(self,**kwargs):
context = super().get_context_data(**kwargs)
context['title'] = models.Comment.objects.get(pk=1) # I don't know how to change this value
context['id'] = self.model.id
return context
article_list.html:
{% for article in articles %}
<h2>{{ article.title }}</h2>
<p>{{ article.content }}</p>
<h5>Id of article is {{ id }}</h5>
<h6>{{ title }}</h6>
{% endfor %}
我想在Comment上使用count(),这样我就可以通过帖子获得评论的数量。为了获得文章的评论列表,我认为我需要每篇文章的pk,这样我就可以找到评论的数量,但它不起作用。你有什么好主意吗?
另外,当我试图在get_context_data() [in views.py]中获取id时,我得到了类似于<django.db.models.query_utils的东西。在0x7fead2213fd0>除了数字,你知道有什么方法可以得到一个实际的数字吗?
您可以在模板中获得所有文章及其评论的列表,而无需覆盖get_context_data()
。你可以将related_name
传递给ForeignKey关系来指定它,但如果你不这样做,Django会自动为你创建一个。自动创建的默认值为:comment_set
。查看这里的文档。
article_list.html
{% for article in articles %}
<h2>{{ article.title }}</h2>
<p>{{ article.content }}</p>
<p>Total comments: {{ article.comment_set.count }}</p>
{% for comment in article.comment_set.all %}
<p>{{ comment.author }}</p>
<p>{{ comment.comment }}</p>
{% endfor %}
{% endfor %}
我建议设置related_name
,然后你的模型和模板代码将是:
article = models.ForeignKey(Article,on_delete=models.CASCADE, related_name="comments")
{% for comment in article.comments %}
{% endfor %}
如果你想了解更多,这里也有一篇相关的Stack Overflow帖子。