如何修复Django中UnboundLocalError: username变量引用前未赋值错误?
错误原因及修复方案
错误根源
出现UnboundLocalError是因为两个核心逻辑问题:
- 变量作用域错误:
username、first_name等变量仅在form.is_valid()为True的分支内定义,但创建用户的代码写在该分支外面。当POST请求但表单验证失败时,这些变量未被赋值就被引用,直接触发错误。 - GET请求未处理:GET请求时,代码直接用
request.POST初始化表单,还会尝试执行创建用户的逻辑,完全不符合表单页面的正常流程(GET请求应该展示空表单)。
修复后的代码
@login_required def createPatient(request): # 区分POST/GET请求处理表单 if request.method == "POST": form = PatientForm(request.POST, request.FILES) # 仅在表单验证通过时执行创建逻辑 if form.is_valid(): first_name = form.cleaned_data['first_name'] last_name = form.cleaned_data['last_name'] username = form.cleaned_data['username'] email = form.cleaned_data['email'] password = form.cleaned_data['password'] address = form.cleaned_data['address'] phone_number = form.cleaned_data['phone_number'] dob = form.cleaned_data['dob'] gender = form.cleaned_data['gender'] user = CustomUser.objects.create_user( username=username, email=email, password=password, first_name=first_name, last_name=last_name, user_type=5 ) # 更新患者关联字段并保存 user.patients.address = address user.patients.phone_number = phone_number user.patients.dob = dob user.patients.gender = gender user.patients.save() # 可选:创建成功后重定向到患者列表页 # return redirect('patient_list') else: # GET请求展示空表单 form = PatientForm() # 返回表单页面(空表单或验证失败的表单) return render(request, 'your_template.html', {'form': form})
额外注意事项
- 函数末尾必须添加
render返回表单页面,否则会返回404错误。 - 如果
user.patients是OneToOneField关联的模型实例,修改字段后需单独调用user.patients.save(),否则更改不会持久化到数据库。 - 表单验证失败时,
form会自动携带错误信息,返回给前端后可直接展示给用户。
内容的提问来源于stack exchange,提问作者Nayan Khade
相关产品推荐
相关产品推荐

