单击按钮并刷新网站后,所有按钮都像在 Django 详细视图上选中的一样
After click button and refresh website all buttons are like selected on django detail view
我在 django 1.11 中安装了应用程序,我在 post 的详细信息页面上对评论进行投票时遇到问题。
对于每个我想检查是否被投票赞成或否决。现在,如果我点击投票 - 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
您可能想在获取评论时对其进行注释:
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
告诉当前用户是否赞成此评论。
我在 django 1.11 中安装了应用程序,我在 post 的详细信息页面上对评论进行投票时遇到问题。
对于每个我想检查是否被投票赞成或否决。现在,如果我点击投票 - 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
您可能想在获取评论时对其进行注释:
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
告诉当前用户是否赞成此评论。