我正在尝试建立一个使用Django的投票系统,限制注册用户在一次投票中只投票一次(尽管有多个选项可用/非常同意/不同意)。到目前为止,我已经能够建立一个他们无法进行同样投票的系统(因此他们不能投票“同意”两次),但他们可以改变他们的投票并且它仍然会通过(所以他们可以投票“同意”,然后再次投票为“不同意”)。我希望他们被限制为每个主题一票,我不知道如何调整我的代码来实现这一目标。以下是我的观点:
def vote(request, prediction_id):
prediction = get_object_or_404(Prediction, pk=prediction_id)
selected_choice = prediction.choice_set.get(pk=request.POST['choice'])
if Voter.objects.filter(prediction=prediction, choice=selected_choice, user_id=request.user.id).exists():
return render(request, 'predictions/detail.html', {
'prediction': prediction,
'error_message': "Sorry, but you have already voted."
})
else:
selected_choice.votes += 1
selected_choice.save()
Voter.objects.create(prediction=prediction, choice=selected_choice, user_id=request.user.id)
return HttpResponseRedirect(reverse('predictions:results', args=(prediction.id,)))
以下是我的模特:
class Prediction(models.Model):
prediction_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
# ...
def __str__(self):
return self.prediction_text
class Choice(models.Model):
prediction = models.ForeignKey(Prediction, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
class Voter(models.Model):
user = models.ForeignKey(User)
choice = models.ForeignKey(Choice)
prediction = models.ForeignKey(Prediction)
答案 0 :(得分:0)
if Voter.objects.filter(prediction=prediction, user_id=request.user.id).exists()
此行代码表示此用户是否已选择投票。
如果我可以理解,那么预测类就是问题"。所以其他解决方案是:
class Voter(models.Model):
user = models.ForeignKey(User)
choice = models.ForeignKey(Choice)
prediction = models.ForeignKey(Prediction)
Meta:
unique_together = (("driver", "prediction"),)