首页 > 解决方案 > 我怎样才能让用户只投票一次

问题描述

所以我正在尝试使用 Django 构建一个投票应用程序,但我遇到了一个问题,我无法阻止用户投票两次或更多次

这是我的模型.py

class NewPoll(models.Model):

    Question = models.CharField(max_length=255,default=False)
    option1 = models.CharField(max_length=255)
    option2 = models.CharField(max_length=255)
    option3 = models.CharField(max_length=255)

    option1count = models.IntegerField(default=0)
    option2count = models.IntegerField(default=0)
    option3count = models.IntegerField(default=0)


    created_by= models.ForeignKey(User,related_name='newpoll',on_delete=models.CASCADE)
    created_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.Question

我在views.py中的投票视图中的内容

#some codes

@login_required(login_url='signin')
def vote(request,poll_id):
    newpoll = get_object_or_404(NewPoll,pk=poll_id)
    if request.method == "POST":
        selected_option = (request.POST['poll'])

        if selected_option == 'option1':
            newpoll.option1count +=1
        elif selected_option == 'option2':
            newpoll.option2count +=1
        elif selected_option == 'option3':
            newpoll.option3count +=1
        else:
            return HttpResponse("Wrong Form!")
        newpoll.save()
        return redirect('result',poll_id=newpoll.pk)
    return render(request,'vote.html',{'newpoll':newpoll})    


标签: django

解决方案


您最好将投票、选项和投票拆分为单独的模型。然后您可以使用 meta 选项对投票模型进行唯一性检查unique_together

class NewPoll(models.Model):

    Question = models.CharField(max_length=255,default=False)

    created_by= models.ForeignKey(User,related_name='poll',on_delete=models.CASCADE)
    created_date = models.DateTimeField(auto_now_add=True)

class PollOption(models.Model):
    poll = models.ForeignKey(NewPoll, on_delete=models.CASCADE)
    option = models.CharField(max_length=255)

class Vote(models.Model):
    option = models.ForeignKey(PollOption, on_delete=models.CASCADE)
    user = models.ForeignKey(User,on_delete=models.CASCADE)

    class Meta:
        unique_together = ['option', 'user']

推荐阅读