You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:10:50