Как отобразить отношения с иностранными ключами в Django
У меня есть простое отношение ManyToOne, в котором пользователи могут публиковать комментарии к объекту poller.
Комментарии Модель
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)
Теперь я хочу вывести комментарии для каждого poller в мой шаблон следующим образом
<div id="comments-choice-one-wrapper" class="comments-wrapper">
{{ poller.comments.comment }}
</div>
Почему-то не отображается комментарий, который я создал заранее. Я проверил в админке Django, действительно ли комментарий связан с поллером, и это выглядит просто прекрасно.
poller.comments.all
- это QuerySet
из Comment
, поэтому это коллекция, поэтому нет смысла использовать .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
или self.body
не имеет особого смысла, так как у этой модели нет свойства или поля name
. Скорее всего, вам следует использовать __str__
на Poller
:
class Comments(models.Model):
# ⋮
def __str__(self):
return f'Comment {self.comment} by {self.poller}'
Примечание: обычно модели Django присваивается сингулярное имя, поэтому
Comment
вместо.Comments