После нажатия кнопки и обновления веб-сайта все кнопки, как выбраны в подробном представлении Django - PullRequest
0 голосов
/ 27 января 2019

У меня есть приложение в django 1.11, и у меня проблема с голосованием вверх или вниз по комментариям на странице подробностей поста.

Для каждого я хотел бы проверить, проголосовали ли за или против.Теперь, если я нажму «Голосовать вверх» - код jquery - измените только эту кнопку при голосовании «вверх», счетчик голосов также работает нормально, но после обновления веб-сайта все кнопки голосования «вверх» становятся похожими на проголосовавшие.

Ниже мой код

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = RichTextUploadingField()

    def __str__(self):
        return self.text

    def total_vote_up(self):
        return self.votes_up.count()

    def total_vote_down(self):
        return self.votes_down.count()


class Comment(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    text = RichTextUploadingField()
    votes_up = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='up_votes')
    votes_down = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='down_votes')

Ниже приведен мой подробный вид с комментариями объектов.


class PostDetail(generic.DetailView, FormMixin):
    context_object_name = 'post'
    model = Post
    form_class = CommentForm

    def get_context_data(self, **kwargs):
        is_voted_up = False
        is_voted_down = False

        comments = self.get_object().comments.all()
        for comment in comments:
            if comment.votes_up.filter(id=self.request.user.id).exists():
                is_voted_up = True
            if comment.votes_down.filter(id=self.request.user.id).exists():
                is_voted_down = True

        context = super(PostDetail, self).get_context_data(**kwargs)
        context['comments'] = self.get_object().comments.all()
        context['form'] = CommentForm(initial={'post': self.get_object(), 'author': self.get_user()})
        context['is_voted_up'] = is_voted_up
        context['is_voted_down'] = is_voted_down
        return context

1 Ответ

0 голосов
/ 27 января 2019

Вы, вероятно, хотите комментировать свои комментарии при их получении:

votes_by_user = User.objects.filter(
   up_votes__pk=OuterRef('pk'),
   id=self.request.user.id,
)
context['comments'] = self.object.comments.all().annotate(upvoted=Exists(votes_by_user))

Тогда в вашем шаблоне каждый comment будет иметь атрибут upvoted, указывающий, проголосовал ли текущий пользователь за этот комментарий.

...