django 过滤当前用户进行投票

Posted

技术标签:

【中文标题】django 过滤当前用户进行投票【英文标题】:django filter by current user to vote 【发布时间】:2014-12-21 02:58:47 【问题描述】:

我有一个模型:

class Question(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=120)
    description = models.TextField()
    answers = models.ManyToManyField('Answer',related_name='answer_name', blank=True)
    post_date = models.DateTimeField(auto_now=True)
    vote = models.IntegerField(default=0)

    def __unicode__(self):
        return self.title

我正在制作一个论坛,用户可以在其中发布问题。我想要的是如果该问题有用,那么其他用户可以对该问题进行投票,但只能投票一次。如果用户已对该问题投了一次票并尝试再次投票,则会显示显示消息,说明您不能投票两次。我为此写了一个视图,除了两次投票的验证之外,一切都正常。

这是我的看法:

def VoteCountView(request, pk):

    ques = Question.objects.get(id=pk)
    cpk = ques.category.id
    valid_user = ques.user.username

    if request.user.is_authenticated():
        if request.user.is_general_user:
            if request.user.username == valid_user:
                messages.warning(request, "You cannot vote your own question")
                return redirect("question-detail", pk, cpk)
            else:
                vote_limit = Question.objects.values_list("vote", flat=True).filter(pk=pk).filter(user=request.user)[0]
                if vote_limit < 1:
                    vote_count = ques
                    count = vote_count.vote
                    count +=1
                    vote_count.vote = count
                    vote_count.user = request.user
                    vote_count.save()
                    return redirect("question-detail", pk, cpk)
                else:
                    messages.warning(request,"You cannot vote twice")
                    return redirect("question-detail", pk, cpk)
        else:
            messages.warning(request,"You are not allowed to vote a question")
            return redirect("question-detail", pk, cpk)
    else:
        messages.warning(request, "You must login/sign up to vote.")
        return redirect("question-detail", pk, cpk)

我想在这里实现的是vote_limit = Question.objects.values_list("vote", flat=True).filter(pk=pk).filter(user=request.user)[0]。我认为我使用的最后一个过滤器filter(user=request.user) 不起作用,因为它被发布问题的用户过滤。

我可以通过相同的模型来做到这一点,或者我必须制作不同的模型来实现这一点。喜欢:

class VoteCount(models.Model):
    user = models.ForeignKey(User)
    title = models.ForeignKey(Question)
    vote = models.IntegerField(default=0)

谁能帮帮我??

【问题讨论】:

【参考方案1】:

你可以简单地检查一下

VoteCount.objects.filter(user=request.user, title=ques).exists()

知道用户是否已经投票过这样的问题

【讨论】:

是的,这就是我要问的......我应该制作 VoteCount 模型来实现这一点,还是我可以通过 Question 模型来做到这一点??? 我还没有制作 VoteCount 模型。我要问的是我可以从问题模型验证当前用户吗?还是我必须制作 VoteCount 模型?? @Aaeronn 是的,因为您需要记住进行投票的实际用户【参考方案2】:

只需使用 exists() 来检查用户是否已经投票。我认为您需要按照您定义的方式创建模型 Votecount 以完成任务。然而,投票可能仍然存在问题,而不是在 Votecount 模型中。只需更新 Question 模型中的投票,并在每次有人投票时添加到 Votecount 模型。

def VoteCountView(request, pk): 
    ques = Question.objects.get(id=pk)
    cpk = ques.category.id
    valid_user = ques.user.username

    if request.user.is_authenticated():
        if request.user.is_general_user:
            if request.user.username == valid_user:
                messages.warning(request, "You cannot vote your own question")
                return redirect("question-detail", pk, cpk)
            elif VoteCount.objects.filter(user=request.user, title=ques).exists():
                messages.warning(request,"You cannot vote twice")
                return redirect("question-detail", pk, cpk)
            else:
                ques.vote +=1
                ques.save()
                v=Votecount(title=ques, user=request.user)
                v.save()    
        else:
            messages.warning(request,"You are not allowed to vote a question")
            return redirect("question-detail", pk, cpk)
    else:
        messages.warning(request, "You must login/sign up to vote.")
        return redirect("question-detail", pk, cpk)

【讨论】:

以上是关于django 过滤当前用户进行投票的主要内容,如果未能解决你的问题,请参考以下文章

Django:为当前用户过滤数据库

Django-form组件中过滤当前用户信息

使用 F 和 Q 表达式进行 Django 模型过滤

CloudKit修改了用户过滤的记录?

使用 Django 无限分页进行过滤

Django开发博客系统(07-根据需求定制管理后台)