2017-02-13 3 views
0

私は候補者のプールから少しランダムなオプションを表示するジャンゴ投票システムに取り組んでいます。 IDのオプションを使用して、私は人々がソースコードを変更して同じオプションで投票を送信することを何度も続ける方法を考えることができません、このオプションはビューとテンプレートのように表示されます:表示されたオプションからの投票を禁止する、無期限オプションの投票アプリケーション

リターン(要求、 '/vote.html' をレンダリング{ 'P':経口、 'OPTS' opts.order_by() '?' [3]

{%for v in opts%} 
<div class='votebox' name='{{v.id}}' onclick='vote()'></div> 
{%endfor%} 

ユーザーが表示されたオプションに投票したかどうかを確認するコードの効率的な方法は何ですか?

投票オプションモデルがこの

class Submission(models.Model): 
    def __str__(self): 
     return self.title 

    title = models.CharField(max_length=20) 
    signature = models.CharField(max_length=20) 
    sub_date = models.DateField() 
    poll = models.ForeignKey('Poll', on_delete=models.CASCADE) 
    vote_count = models.IntegerField(null=True) 
    img = models.ImageField(upload_to='MEDIA_ROOT') 
    repcount = models.IntegerField() 

であるポールモデルは次のとおりです。

class Poll(models.Model): 
    title = models.CharField(max_length=20) 
    author = models.ForeignKey(User, on_delete=models.CASCADE) 
    start_date = models.DateField() 
    end_date=models.DateField() 

と、それは行くビューは、この

def poll(request, id): 
    if request.method == "GET": 
     po = poll.objects.get(id=id) 
     daysleft = poll.end_date - datetime.date.today() 
     opts = po.submission_set.all() 
     return render(request, '/vote.html', {'p': po, 'opts' : opts, 'daysl':daysleft} 


    elif request.method == "POST": 
     voted = request.POST.get('voteval', False) 
     sub = Submission.objects.get(id=voted) 
     sub.vote_count += 1 
     sub.save() 
+0

シェアをしていない場合は、新しいVoteオブジェクトを作成しますあなたの投票に関連して、あなたはより良い答えを得ることができます。また、ユーザーを1回だけ投票させたり、候補者ごとに1回投票するように制限したりしたいですか? – 4140tm

+0

いいえ、彼らは欲しいものとして何度も投票することができます。ちょっと待ってください。 – YoungVenus

答えて

0

である私は、仲介モデルを追加しますUserSubmission

の間
class Vote(models.Model): 
    user = models.ForeignKey(User) 
    submission = models.ForeignKey(Submission) 

    class Meta: 
     unique_together = (
      ('user', 'submission'), 
     ) 

は今、ビューのPOST一部を処理するとき、ユーザーが以前にこの投稿に投票した場合、あなたは確認することができ、彼がモデルとビューを

elif request.method == "POST": 
     voted = request.POST.get('voteval', False) 
     sub = Submission.objects.get(id=voted) 
     user = request.user 
     try: 
      vote = Vote.objects.get(user=user, submission=sub) 
      # warn user that he's voted for this submission 
     except Vote.DoesNotExist: 
      vote = Vote.objects.create(user=user, submission=sub) 
      sub.vote_count += 1 
      sub.save() 
+0

実際にログインする必要はありません): – YoungVenus

+0

@YoungVenusあなたが識別できるログインユーザーを扱っていない場合セッション鍵でそれらを削除することはできますが、これは明らかにばかばかしいことではありません。 –

+0

私はevercookieライブラリを使うことを捨てました。私はそれを作ることができるほど良いと思います – YoungVenus

関連する問題