Как отобразить отношения с иностранными ключами в 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.

Вернуться на верх