Django注册表单报错UnboundLocalError:context未提前赋值
解决Django注册功能UnboundLocalError错误
错误原因
问题出在register视图函数的逻辑漏洞:当请求为POST方法但表单验证不通过时,代码未定义context变量,直接执行到最后的return render(...)时,就会抛出local variable 'context' referenced before assignment错误。当前逻辑仅在GET请求的else分支中定义了context,完全没处理POST请求且表单无效的场景。
另外,原代码中else分支里直接传递表单类(UserRegisterForm、UserProfileForm)而非实例,这也是错误的,表单必须实例化才能在模板中正确渲染。
修复后的代码
修改views.py中的register函数,确保所有代码路径都能正确赋值context:
def register(request): if request.method == 'POST': form = UserRegisterForm(request.POST) pform = UserProfileForm(request.POST) if form.is_valid() and pform.is_valid(): user = form.save() profile = pform.save(commit=False) profile.user = user profile.save() username = form.cleaned_data.get('username') messages.success(request, f'Your account has been created! You are now able to login') return redirect('login') # 表单验证失败,将带错误信息的表单存入context context = { 'form': form, 'p_form': pform } else: # GET请求,实例化空表单 context = { 'form': UserRegisterForm(), 'p_form': UserProfileForm() } return render(request, 'users/register.html', context)
或者更简洁的写法,先初始化context再根据请求类型更新:
def register(request): # 初始化context,默认是空表单实例 context = { 'form': UserRegisterForm(), 'p_form': UserProfileForm() } if request.method == 'POST': form = UserRegisterForm(request.POST) pform = UserProfileForm(request.POST) if form.is_valid() and pform.is_valid(): user = form.save() profile = pform.save(commit=False) profile.user = user profile.save() username = form.cleaned_data.get('username') messages.success(request, f'Your account has been created! You are now able to login') return redirect('login') # 验证失败,替换context中的表单为带错误的实例 context['form'] = form context['p_form'] = pform return render(request, 'users/register.html', context)
额外说明
- 所有代码路径必须保证
context被赋值,避免未定义变量的情况。 - 表单类必须实例化(加
())后才能传递给模板,否则无法正常渲染表单及错误信息。
内容的提问来源于stack exchange,提问作者mx1txm
相关产品推荐
相关产品推荐

