0

私はジャンゴが初めてです。

私は自分のviews.pyの下にこのコードを持っています

poll_list = []

@login_required
@never_cache
def vote(request, poll_id):
    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 detail(request, poll_id, error_message="You didn't select a choice.")
    else:
        if request.session.get('voted_on', False):
            poll_list = []
            request.session['voted_on'] = poll_list

        if poll_id in request.session.get('voted_on', []):
            return detail(request, poll_id, has_voted="You have already voted.")

        selected_choice.votes += 1
        selected_choice.save()

        poll_list.append(poll_id)
        request.session['voted_on'] = poll_list
        return HttpResponseRedirect(reverse('poll_results', args=(p.id,)))
    return HttpResponse("You're voting on poll %s." % poll_id) 

このエラーが発生しました:

UnboundLocalError at /polls/3/vote/
local variable 'poll_list' referenced before assignment

助けてください..なぜこのエラーが発生し続けるのかわかりません。ありがとう

4

2 に答える 2

1

poll_listメソッドでは、if条件付きでのみ変数を作成しているため、このエラーが発生します。したがって、その条件がfalseの場合、はありませんpoll_list。したがって、でそれを使用しようとするとpoll_list.append(poll_id)、Pythonはそのエラーを出します。

あなたがやろうとしているのは、メソッドの外で宣言したグローバル変数を使用することだと思います。これは、あなたが望むことをする正しい方法ではありません。

「間違った」修正はglobal poll_list、メソッドを追加することです。

正しい修正は、メソッドを再構築することです。

# poll_list = [] - not needed

@login_required
@never_cache
def vote(request, poll_id):
    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 detail(request, poll_id, error_message="You didn't select a choice.")
    else:
        poll_list = request.session.get('voted_on', [])

        if poll_id in poll_list:
            return detail(request, poll_id, has_voted="You have already voted.")

        selected_choice.votes += 1
        selected_choice.save()

        poll_list.append(poll_id)
        request.session['voted_on'] = poll_list
        return HttpResponseRedirect(reverse('poll_results', args=(p.id,)))
    return HttpResponse("You're voting on poll %s." % poll_id) 
于 2012-04-26T06:44:35.477 に答える
0

名前に割り当てると、コンパイラはそれがローカルであると考えます。global poll_listこれを変更するには、関数の先頭で使用します。

ただし、これにより他の問題が発生するため、関係なく関数を再構築する必要があります。

于 2012-04-26T06:40:53.523 に答える