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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:10:12