首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制每个用户只投票一次(投票,django,python)

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

Stack Overflow用户
提问于 2016-07-12 15:15:37
回答 1查看 1.3K关注 0票数 0

我发现了一个类似的问题here,但不像在那里和django官方教程,我没有一个单独的选择类。我怎样才能限制每个用户只投一票?我应该在代码中修改什么?

我的models.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
{% 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 %}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-12 15:25:46

您似乎忘记在用户投票之后创建voter实例。

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38332868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档