Python Django UnboundLocalError

时间:2012-04-26 06:37:45

标签: django

我是django的新手。

我在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

请帮帮我..我不明白为什么我一直收到这个错误。 感谢

2 个答案:

答案 0 :(得分:1)

您收到此错误,因为在您的方法中,您只在if条件中创建变量poll_list。因此,如果该条件为假,则没有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) 

答案 1 :(得分:0)

分配名称会使编译器认为它是本地的。使用函数开头的global poll_list来更改此值。

但是这会导致其他问题,所以你应该重新设计该功能。