django - 如何在 Django 中呈现外键关系
问题描述
我有一个简单的多对一关系,用户可以在其中向轮询器对象发表评论。
评论模型
class Comments(models.Model):
poller = models.ForeignKey(Pollers, on_delete=models.CASCADE, related_name='comments')
created_on = models.DateTimeField(auto_now_add=True)
comment = models.CharField(max_length=250)
created_by = models.CharField(max_length=80)
class Meta:
ordering = ['created_on']
def __str__(self):
return 'Comment {} by {}'.format(self.body, self.name)
风景
def single_poller(request, poller_id):
"""retrieves the item clicked by the user from DB and renders
the single_poller template for further user interaction
"""
# Retrieve the item via get
poller = Pollers.objects.get(poller_id=poller_id)
# Increase the view field of the object by
poller.poller_views += 1
# Save the changed instance and overwrite new view integer
poller.save()
# Get the form for comments
form = CommentsForm
context = {
'poller': poller,
'form': form
}
return render(request, 'pollboard/single_poller.html', context)
现在我想像这样将每个轮询器的评论呈现到我的模板中
<div id="comments-choice-one-wrapper" class="comments-wrapper">
{{ poller.comments.comment }}
</div>
不知何故,它不会呈现我事先创建的评论。如果评论与轮询器相关,我检查了 Django 管理员,这看起来很好。
解决方案
poller.comments.all
is a QuerySet
of Comment
s, 所以这是一个collection,因此使用它是没有意义的,.comment
因为这是一个Comment
对象的属性,而不是QuerySet
带有注释的属性。
您可以枚举comments.all
,从而单独呈现这些注释:
<div id="comments-choice-one-wrapper" class="comments-wrapper">
{% for comment in poller.comments.all %}
{{ comment.comment }}
{% endfor %}
</div>
在您的Comments
模型中,使用self.name
orself.body
没有多大意义,因为该模型没有name
属性或字段。您可能应该__str__
在以下位置使用Poller
:
class Comments(models.Model):
# ⋮
def __str__(self):
return f'Comment {self.comment} by {self.poller}'
注意:通常 Django 模型被赋予一个单数名称,所以
Comment
而不是.Comments
推荐阅读
- doctrine - Doctrine 2 在 JSONb 字段中加入 PK
- javascript - 将对象数组减少为对象对象
- mongodb - 使用 mongo 聚合 $unwind 后 $limit 被忽略
- php - 如何运行要求在 php 中输入的 python 脚本
- android - 连接到树莓派 3b+ 时出现 GATT 错误 133,但连接到 arduino 时却没有?
- javascript - Javascript拆分返回意外令牌
- nginx - 将 Nginx 放在 Logstash 前面?
- django - GSPREAD 和 Windows Server 的问题
- javascript - Tableau 嵌入到外部应用程序中
- python - 如何在“scipy.optimize.curve_fit”中将推导作为边界