Django注册表单校验plan空值时报MultiValueDictKeyError如何解决
问题原因
你遇到的MultiValueDictKeyError报错核心原因是:当用户未选中任何plan单选按钮时,浏览器不会将plan字段随POST请求提交到后端,此时你用request.POST['plan']的方式直接取值,Django的QueryDict对象找不到对应键就会直接抛出异常,还没执行到你写的空值判断逻辑就报错了。
正确实现步骤
- 取值时使用安全的
get方法获取plan字段
不要用request.POST['plan']直接取值,改用get方法指定默认值,无对应键时不会抛错:
# 放在所有校验逻辑之前,获取plan字段,未传值时默认返回None plan = request.POST.get('plan', None)
- 调整校验逻辑
直接判断plan是否为空即可,覆盖未传值、传空字符串的场景:
if password1==password2: if CustomUser.objects.filter(email=email).exists(): messages.info(request, 'User with same email already exists') return redirect('register') # 新增plan非空校验 elif not plan: messages.info(request, 'Please select a plan') return redirect('register') else: # 原有创建用户的逻辑不变 user=CustomUser.objects.create_user(full_name=full_name.upper(),age=age, phone_no=phone_no, address=address, plan=plan, email=email.lower(), password=password1) user.is_active = False user.save() usr_otp = random.randint(100000, 999999) UserOtp.objects.create(user = user, otp = usr_otp) mess = f"Hello, {user.full_name},\n Please enter the otp to validate your email and activate your account. \nYour OTP is {usr_otp} .\n Thanks!" return render(request, 'register.html', {'otp': True, 'user': user})
- 前端可选优化
给plan单选按钮组添加required属性,让浏览器先做前端必填校验,用户未选择时无法提交表单,减少无效请求。
内容的提问来源于stack exchange,提问作者Ritankar Bhattacharjee
相关产品推荐
相关产品推荐

