2012-04-25 12 views
0

私はdjangoで新しいです。Python Djangoセッション

私はこの投票アプリケーションを持っています。投票ごとにセッションごとに1票を選んで有権者を制限したいと思います。例:

投票1位

ポーリング#2

私はそれが私が投票第1位に投票することはできませんが、私はポール#2のために投票することができます後、#1をポーリングするために投票します。

だから私は、ポーリングIDをリストに入れてそこにあるかどうかをチェックすることにしました。私は投票ボタンこれで私を助けることができる

誰をクリックした後に、このエラーが要求されます

KeyError at /polls/3/vote/ 
'has_voted' 

poll_list = [] #declare the poll_list variable 

@login_required 
@never_cache 
def vote(request, poll_id): 
    global poll_list #declare it as global 
    p = get_object_or_404(Poll, pk=poll_id) 
    try: 
     selected_choice = p.choice_set.get(pk=request.POST['choice']) 
    except (KeyError, Choice.DoesNotExist): 
     return render_to_response('polls/detail.html', { 
      'poll': p, 
      'error_message': "You didn't select a choice.", 
     }, context_instance=RequestContext(request)) 
    else: 
     if poll_id in request.session['has_voted']: #here is the checking happens 
      return HttpResponse("You've already voted.") 

     selected_choice.votes += 1 
     selected_choice.save() 

     poll_list.append(poll_id) #i append the poll_id 
     request.session['has_voted'] = poll_list #pass to a session 
     return HttpResponseRedirect(reverse('poll_results', args=(p.id,))) 
    return HttpResponse("You're voting on poll %s." % poll_id) 

私はエラーを得ましたか?あなたは、まだ投票していない場合は 'has_voted'キーが欠落しているので、あなたはKeyError例外を取得するよう

おかげで、 ジャスティン

+1

グローバルな 'poll_list'はうまくいかないことに注意してください。本番環境で複数のdjangoプロセスを実行すると、それぞれが独自のバージョンのリストを持ちます。たとえば、ポーリングをデータベースに貼り付けるのがベストです。 –

+0

どうすればいいですか?助けてください。 – justin

+1

実際、あなたのコードを少し読めば、グローバルなpoll_listは必要ありません。メソッドの開始時に 'poll_list = request.session.get( 'has_voted'、[])'を実行します。セッションは、そのセッションを保存する場所です。実際にセッションごとにグローバルに追跡する必要はありません。 –

答えて

3

は、request.session['has_voted']は、まだ設定されていません。

request.session.get('has_voted', [])を使用できます。has_votedがない場合は、デフォルトで空のリストになります。

has_votedは真偽値のように聞こえますが、voted_onが良いかもしれません)。

関連する問題