2014-01-29 157 views
0

在一個簡單的調查應用程序中,用戶應該只對一組問題(調查)投票一次。我可以檢查用戶是否投票(懶惰用戶或授權用戶),但只能在數據庫中預先填充測試數據的字段。我也知道一個懶惰的用戶可以刪除這個cookie並且能夠再次投票。檢查用戶是否投票,如果不保存投票

我不知道如何在form.is_valid()之後致電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模型併爲您在模板TrueFalse

回答

0

新的解決方案,因爲survey_iduser_id已經在模型Response

@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) 
0

好吧,我

@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,))) 

    [...] 

我敢肯定有更好的方法解決了這個問題,但它適用於現在。