2014-01-29 3 views
0

간단한 설문 조사 앱 사용자는 일련의 질문 (설문 조사)에 대해 한 번만 투표해야합니다. 사용자가 투표 한 (게으른 사용자인지 아니면 권한이 부여 된 사용자인지) 확인할 수는 있지만 데이터베이스의 테스트 데이터로 필드를 채울 경우에만 확인할 수 있습니다. 나는 또한 게으른 사용자가 쿠키를 삭제하고 다시 투표 할 수 있음을 알고 있습니다.투표 한 사용자가 투표하지 않았는지 확인하십시오.

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를 사용하여 템플릿의 True 또는 False를 확인하는 것입니다.

답변

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

    [...] 

더 나은 방법이 확신으로 해결하지만 지금은 작동합니다.

관련 문제