Django视图函数报错:局部变量'form_b'在赋值前被引用
Django视图报错:local variable 'form_b' referenced before assignment
错误原因
点击注册按钮触发sign_up分支时,代码只初始化了注册表单form,但没有定义登录表单对应的form_b变量;同理点击登录按钮的log_in分支也没有初始化注册表单form。最后渲染模板时需要传递这两个表单变量,导致未定义的变量被引用,抛出错误。
修复方案
核心思路是提前初始化所有需要用到的表单变量,确保每个分支都能访问到完整的表单实例,同时统一变量命名提升可读性:
修正后的视图代码:
def register(request): # 提前初始化两个空表单,确保所有分支都能获取到变量 register_form = RegisterForm() login_form = LogInForm() if not request.user.is_authenticated: if request.POST.get('submit') == 'sign_up': register_form = RegisterForm(request.POST) if register_form.is_valid(): register_form.save() # 保存成功后重置表单,清空输入内容 register_form = RegisterForm() elif request.POST.get('submit') == 'log_in': login_form = LogInForm(request=request, data=request.POST) if login_form.is_valid(): uname = login_form.cleaned_data['username'] upass = login_form.cleaned_data['password'] user = authenticate(username=uname, password=upass) if user is not None: login(request, user) return redirect('/') # 统一传递两个表单到模板,对应原模板的form(注册)和form1(登录) return render(request, 'auth.html', {'form': register_form, 'form1': login_form})
关键修正点
- 把两个表单的初始化放在最外层,避免分支判断中遗漏变量定义
- 处理POST请求时,仅重新实例化对应操作的表单,另一个表单保持初始空实例
- 变量名改为
register_form和login_form,解决原代码中form、form1、form_b的命名混乱问题
额外提示
模板中注册按钮的文字拼写有误:Sing Up应改为Sign Up,建议修正避免用户困惑。
内容的提问来源于stack exchange,提问作者Amaan Laghari
相关产品推荐
相关产品推荐

