Как получить все комментарии к посту, используя связанные имена? - PullRequest
1 голос
/ 21 июня 2020

Я пытаюсь создать страницу комментариев для сайта в стиле блога, на котором будут перечислены все предыдущие комментарии для одного связанного сообщения.

Мне сложно понять, как структурировать представление, чтобы получить то, что я ищу. Я пытался использовать связанные имена для получения данных, но не уверен, что это правильный метод.

Вот мои модели:

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    title = models.CharField(max_length=128)
    content = models.TextField()
    image = models.ImageField(upload_to='post_pics', blank=True)
    date_posted = models.DateTimeField(default=timezone.now)

    def get_absolute_url(self):
        return reverse('home')

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    comment = models.TextField()
    date_created = models.DateTimeField(default=timezone.now)

    def get_absolute_url(self):
        return reverse('home')

И вот мое мнение:

class CommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    template_name = 'home/comment-form.html'
    fields = ['comment',]

    def get_context_data(self, **kwargs):
        context = super(CommentCreateView, self).get_context_data(**kwargs)
        context['post'] = Post.objects.get(pk=self.kwargs['pk'])
        comments = Post.comments.all()
        context['comments'] = comments
        return context

    def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.post = Post.objects.get(pk=self.kwargs['pk'])
        return super().form_valid(form)

Пробовал кучу разных вещей. Вышесказанное - моя последняя попытка. Когда я пытаюсь запустить это, я получаю ошибку 'ReverseManyToOneDescriptor' object has no attribute 'all'.

Я не знаю, нужно ли мне запускать функцию get_queryset() или, может быть, вызывать queryset в начале представления?

Знайте, что это, вероятно, очень серьезная c проблема, но я ценю помощь!

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Чтобы получить комментарии, вы можете использовать filter()

Class CommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    template_name = 'home/comment-form.html'
    fields = ['comment',]

    def get_context_data(self, **kwargs):
        context = super(CommentCreateView, self).get_context_data(**kwargs)
        post = Post.objects.get(pk=self.kwargs['pk'])
        context['post'] = post
        comments = Comment.objects.filter(post=post)
        context['comments'] = comments
        return context
0 голосов
/ 21 июня 2020

Вам не нужно передавать comments в шаблон, вы можете просто использовать:

{% for comment in post.comments.all %}
    {{ comment.comment }}
{% endfor %}

Это возможно, потому что вы уже определили related_name='comments' в модели Comment.

...