Django - Невозможно присвоить "<Продукт: Тестовый продукт>": "Reply.comment" должен быть экземпляром "Comment"

Я пытаюсь добавить систему комментирования и ответов к моей модели продуктов. Я получаю сообщение Cannot assign "<Product: Тестовый продукт>": "Reply.comment" должен быть экземпляром "Comment". ошибка at new_reply = Reply(content=content, author=self.request.user, comment=self.get_object())

views.py:

class ProductFeedbackView(DetailView):
    model = Product
    template_name = 'store/product_feedback.html'

    def get_context_data(self , **kwargs):
        data = super().get_context_data(**kwargs)

        connected_comments = Comment.objects.filter(product=self.get_object())
        number_of_comments = connected_comments.count()
        data['comments'] = connected_comments
        data['no_of_comments'] = number_of_comments
        data['comment_form'] = CommentForm()

        connected_replies = Reply.objects.filter(comment=self.get_object())
        number_of_replies = connected_replies.count()
        data['replies'] = connected_replies
        data['no_of_replies'] = number_of_replies
        data['reply_form'] = ReplyForm()

        return data

    def post(self , request , *args , **kwargs):
        if self.request.method == 'POST':
            reply_form = ReplyForm(self.request.POST)
            if reply_form.is_valid():
                content = reply_form.cleaned_data['content']
            new_reply = Reply(content=content, author=self.request.user, comment=self.get_object())
            new_reply.save()
            return redirect(self.request.path_info)

        if self.request.method == 'POST':
            comment_form = CommentForm(self.request.POST)
            if comment_form.is_valid():
                content = comment_form.cleaned_data['content']
            new_comment = Comment(content=content, author=self.request.user, product=self.get_object())
            new_comment.save()
            return redirect(self.request.path_info)

models.py:

class Product(models.Model):
    author = models.ForeignKey(User, default=None, on_delete=models.CASCADE)
    title = models.CharField(max_length=120, unique=True)
    description = models.CharField(max_length=300, blank=True, null=True)


class Comment(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, blank=True, null=True, related_name='comments')
    author = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True,)

    content = models.CharField(max_length=200, null=True, blank=False)


class Reply(models.Model):
    comment = models.ForeignKey(Comment, on_delete=models.CASCADE)
    author = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True,)

    content = models.TextField(null=True, blank=False)

Это та же ошибка, на которую я указал в другом вашем вопросе . Вот строка кода, которая не работает:

new_reply = Reply(content=content, author=self.request.user, comment=self.get_object())

Причина этого такая же, как и в другом вашем вопросе: self.get_object() возвращает экземпляр Product, как вы определили model = Product в вашем View.

Чтобы исправить это, вам нужно получить комментарий в методе post перед созданием ответа.

Одним из решений для этого может быть размещение id комментария вместе с данными ответа, например, в виде скрытого поля. Затем этот id можно использовать для получения экземпляра комментария, к которому относится данный ответ. Если вы выберете это решение, также убедитесь, что комментарий действительно принадлежит данному продукту, поскольку вы не хотите, чтобы кто-то просто изменил значение идентификатора комментария и смог ответить на любой другой комментарий.

Некоторые дополнительные отзывы:

  • Вам не нужно проверять метод запроса в методе post, поскольку он уже является методом post.
  • Сейчас вы пытаетесь сохранить и комментарий, и ответ всякий раз, когда создается сообщение. Вам следует либо создать различные представления для каждого поста, либо добавить оператор if для проверки того, какая форма опубликована. Например, также можно использовать скрытое поле со значением для этого.
  • Модель комментария определяет отношение продукта и автора. Оба они имеют значения null=True и blank=True. Я думаю, что вы всегда хотите, чтобы комментарий принадлежал продукту и автору. Поэтому их следует удалить. То же самое для ответа.
  • После успешной публикации используйте HttpResponseRedirect, где вы изменяете url продукта.
Вернуться на верх