繁体   English   中英

限制每个用户只能投票一次(投票,django,python)

[英]Restrict each user to only vote once (Polls, django, python)

我在这里找到了类似的问题,但与那里不同,与Django官方教程中的不同,我没有单独的Choice类。 如何限制每个用户只能投票一个? 我应该更改我的代码吗?

我的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 %}

好像您忘记了用户投票后创建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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM