3

私が持っているものmodels.py

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    is_active = models.BooleanField(default=True)
    # The rest of code...

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    # The rest of code...

class Voter(models.Model):
    user = models.ForeignKey(User)
    poll = models.ForeignKey(Poll)

私が私のvote見解に持っているものviews.py

@login_required
def vote(request, poll_id):
    # Some code...
    # And here is the checking happens.
    voters = [user.id for user in Voter.objects.filter(poll__id=poll_id)]
    if request.user.id in voters:
        return render(request, 'polls/detail.html', {
        'poll': p,
        'error_message': "Sorry, but you have already voted."
        })
    try:
        selected_choice = p.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the poll voting form.
        return render(request, 'polls/detail.html', {
        'poll': p,
        'error_message': "You didn't select a choice."
        })
    else:
        selected_choice.votes +=1
        selected_choice.save()
        v = Voter(user=request.user, poll=p)
        v.save()
        return HttpResponseRedirect(reverse('polls:results', args=(p.id,)))

しかし、このコードは少し奇妙に動作します。

テスト目的で 5 つの投票を作成しました。そして、このコードはそのうちの1 つに対してのみ機能します。 この投票の 1 つだけで、2 回投票しようとするとエラー メッセージが表示されます。この投票の残りの部分では、コードは何度でも投票する機会を与えます。

そして、私には理由がわかりません。あなたはなにか考えはありますか?

4

1 に答える 1

9

VoterID は必ずしもあなたのUserID に適合するとは限りません。これは、(投票者 ID とユーザー ID が誤って一致した場合) 動作しているように見えることがある理由を説明しています。交換:

voters = [user.id for user in Voter.objects.filter(poll__id=poll_id)]
if request.user.id in voters:

if Voter.objects.filter(poll_id=poll_id, user_id=request.user.id).exists()

データベースのバックエンドにチェックを行わせることをお勧めします。

于 2013-09-18T19:39:42.300 に答える