2016-07-12 29 views
0

私は同様の質問hereを見つけましたが、そことは異なり、django公式チュートリアルとは異なり、私は別のChoiceクラスを持っていません。すべてのユーザーを1つだけ投票するように制限するにはどうすればよいですか?コードで何を変更すればよいですか?各ユーザに投票を1回だけ許可する(投票、django、Python)

私のmodels.py:

from django.contrib.auth.models import User 
class Law(models.Model): 
    #some code here 
    yes_votes = models.IntegerField(default=0) 
    no_votes = models.IntegerField(default=0) 


class Voter(models.Model): 
    user = models.ForeignKey(User) 
    law = models.ForeignKey(Law) 

私のviews.py:

class LawDetailView(generic.DetailView): 
    model = Law 
    template_name = 'law_detail.html' 

    def get_queryset(self): 
     """ 
     Excludes any petitions that aren't published yet. 
     """ 
     return Law.objects.filter(pub_date__lte=timezone.now()) 


class LawResultsView(generic.DetailView): 
    model = Law 
    template_name = 'law_results.html' 






def law_yes_vote(request, law_id): 
    if Voter.objects.filter(law_id=law_id, user_id=request.user.id).exists(): 

     return render(request, 'law_detail.html', { 
     'law': p, 
     'error_message': "Sorry, but you have already voted." 
     }) 

    else: 
     p = get_object_or_404(Law, pk=law_id) 
     p.yes_votes += 1 
     p.save() 

     return HttpResponseRedirect(reverse('laws:law_results', args=(p.id,))) 



def law_no_vote(request, law_id): 
    if Voter.objects.filter(law_id=law_id, user_id=request.user.id).exists(): 

     return render(request, 'law_detail.html', { 
     'law': p, 
     'error_message': "Sorry, but you have already voted." 
     }) 

    else: 
     p = get_object_or_404(Law, pk=law_id) 
     p.no_votes += 1 
     p.save() 

     return HttpResponseRedirect(reverse('laws:law_results', args=(p.id,))) 

私law_detail.html:

{% if request.user.is_authenticated %} 
{% if error_message %} 
<h1 >{{ error_message }}</h1> 

{% else %} 

<div class="row" id="row-voting"> 
<form action="{% url 'laws:law_yes_vote' law.id %}" method="post"> 
{% csrf_token %} 

<button class="btn btn-success" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" > 
<label >YES</label> 
</form> 
<form action="{% url 'laws:law_no_vote' law.id %}" method="post"> 
{% csrf_token %} 

<button class="btn btn-danger" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" > 
<label >NO</label> 
</form> 
</div> 
{% endif %} 
{% else %} 

<h1>Please, register</h1> 

{% endif %} 
+0

種類はどれほど重要かに依存します。おもちゃの例であれば、 '投票者'クラスに 'has_voted'ブール値を追加し、投票が記録された後であなたのビューにそれを設定すれば十分でしょう。これが「本当のため」の場合は、すべての種類の偽装攻撃を検討して問題が広すぎる可能性があります。 –

+0

良いアイデア、ありがとう! – Vasile

答えて

1

あなたがvoterを作成するために忘れているように見えますユーザが投票した後のインスタンス。

def law_yes_vote(request, law_id): 
    if Voter.objects.filter(law_id=law_id, user_id=request.user.id).exists(): 

     return render(request, 'law_detail.html', { 
      'law': p, 
      'error_message': "Sorry, but you have already voted." 
     }) 

    else: 
     p = get_object_or_404(Law, pk=law_id) 
     p.yes_votes += 1 
     p.save() 
     Voter.objects.create(law_id=law_id, user_id=request.user.id) 

    return HttpResponseRedirect(reverse('laws:law_results', args=(p.id,))) 

同様に、law_no_voteを更新する必要があります。

関連する問題