Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 检查用户是否投票,如果没有,则保存投票_Django_Django Views - Fatal编程技术网

Django 检查用户是否投票,如果没有,则保存投票

Django 检查用户是否投票,如果没有,则保存投票,django,django-views,Django,Django Views,在一个简单的调查应用程序中,用户只能对一组问题(调查)投票一次。我能够检查用户是否投票(惰性用户或授权用户),但前提是我用数据库中的测试数据预填充字段。我也知道懒惰的用户可以删除cookie,然后再次投票 我不知道如何在表单之后调用save()。是否有效(),因为我不能调用它两次 models.py class Vote(models.Model): user = models.ForeignKey(User) survey = models.ForeignKey(Survey)

在一个简单的调查应用程序中,用户只能对一组问题(调查)投票一次。我能够检查用户是否投票(惰性用户或授权用户),但前提是我用数据库中的测试数据预填充字段。我也知道懒惰的用户可以删除cookie,然后再次投票

我不知道如何在
表单之后调用
save()
。是否有效()
,因为我不能调用它两次

models.py

class Vote(models.Model):
    user = models.ForeignKey(User)
    survey = models.ForeignKey(Survey)
    vote = models.BooleanField(default=False) # not in use yet

    def __unicode__(self):
        return self.vote
views.py

@allow_lazy_user
def survey_detail(request, slug, template_name='survey.html'):

    # allows only active surveys to be called otherwise displays HTTP 404
    survey = get_object_or_404(Survey, is_active=True, slug=slug)

    # checks for user id's in current survey
    voter = [
        v.user.id for v in Vote.objects.filter(survey=survey)
    ]

    # checks if user already voted on survey
    if request.user.id in voter:
            # TODO: use different template or redirect
        return render(request, 'index.html')

    form = ResponseForm(request.POST or None, survey=survey)
    if form.is_valid(): 
        response = form.save(commit=False)
        # gets the current user (lazy or not)
        response.user = request.user
        response.save()

            # HOW DO I SAVE VOTER HERE?

        return HttpResponseRedirect(reverse('survey:confirm', args=(slug,)))

    data = {
        'response_form': form, 
        'survey': survey
    }   

    return render(request, template_name, data)
我的另一个想法是在模型中使用布尔字段
vote
,并在模板中检查
True
False

好的,我用

@allow_lazy_user
def survey_detail(request, slug, template_name='survey.html'):

    [...]

    form = ResponseForm(request.POST or None, survey=survey)
    if form.is_valid(): 
        response = form.save(commit=False)
        response.user = request.user
        response.save()

            if not request.user.id in voter:
                vote = Vote(user=request.user, survey=survey, vote=True)
                vote.save()

        return HttpResponseRedirect(reverse('survey:confirm', args=(slug,)))

    [...]

我确信有更好的方法,但它目前仍然有效。

新的解决方案,因为
调查id
用户id
已经在模型
响应中了:

@allow_lazy_user
def survey_detail(request, slug, template_name='itbarometer/survey_detail.html'):

    # allows only active surveys to be called otherwise displays HTTP 404
    survey = get_object_or_404(Survey, is_active=True, slug=slug)
    categories = [c.name for c in Category.objects.filter(survey=survey)]   
    voter = [v.user.id for v in Response.objects.filter(survey=survey)]

    # checks if survey_id and user_id are already linked
    # if yes, redirect
    if request.user.id in voter:
        return redirect('bereits-abgeschlossen/')

    form = ResponseForm(request.POST or None, survey=survey)
    if form.is_valid(): 
        response = form.save(commit=False)
        # gets the current user (lazy or not)
        response.user = request.user
        response.save()

        return HttpResponseRedirect(reverse('survey:confirm', args=(slug,)))

    data = {
        'response_form': form, 
        'survey': survey, 
        'categories': categories
    }   

    return render(request, template_name, data)