请解释为何出现UnboundLocalError错误?附Django相关代码
为什么会出现UnboundLocalError错误?
兄弟,先给你掰扯清楚什么是UnboundLocalError——说白了就是你在函数里用了一个局部变量,但这个变量在某些代码执行路径里根本没被赋值,Python找不到它的定义,自然就报错了。
看你贴的代码,按道理form变量在函数开头就定义了,不该出这个错啊?哦,大概率是你写代码时缩进没搞对!比如你可能把form = ProfileForm(...)不小心写到if request.method == 'POST'的代码块里面了,像这样:
def Edit_View(request,pk): try: my_form = Profile.objects.get(pk=pk) except: raise Http404('Page Doesnt Found') # 这里缩进错了!form只在POST请求时才会被定义 if request.method == 'POST': form = ProfileForm(request.POST, instance=my_form) if form.is_valid(): form.save() return redirect('detail_view',pk=pk) else: # GET请求时,form根本没被创建,这里引用就炸了 return render (request, 'edit_view.html',{'form':form})
这种情况下,当用户用GET请求打开编辑页面时,form变量完全没被赋值过,但你在else块里还想把它传给模板,Python可不就给你抛UnboundLocalError嘛!
另外,就算你现在的缩进是对的,你的代码还有个问题:当POST请求但表单验证不通过时,函数啥也不返回——Django要求视图必须返回一个HttpResponse对象,不然也会报错(虽然不是这个UnboundLocalError,但也是坑)。
给你改好的代码,你瞅瞅:
def Edit_View(request,pk): try: my_form = Profile.objects.get(pk=pk) except Profile.DoesNotExist: # 别逮啥异常都捕获,就抓具体的不存在异常 raise Http404('Page Doesnt Found') # 统一在开头定义form,确保所有代码路径都能拿到它 form = ProfileForm(request.POST or None, instance=my_form) if request.method == 'POST': if form.is_valid(): form.save() return redirect('detail_view',pk=pk) # 不管是GET请求,还是POST但表单错了,都走到这儿渲染模板 return render(request, 'edit_view.html',{'form':form})
这样改完之后:
- 所有情况
form都有定义,再也不会出UnboundLocalError - 表单验证失败时,会重新渲染带错误提示的页面,用户能知道哪儿错了
- 捕获具体异常,避免把其他无关错误也当成404处理
内容的提问来源于stack exchange,提问作者Chidananda Nayak
相关产品推荐
相关产品推荐

