Django注册添加姓名电话字段后触发MultiValueDictKeyError求助
解决注册功能的MultiValueDictKeyError问题
问题根源
触发MultiValueDictKeyError的核心原因有两个:
- 表单字段名拼写错误,导致视图无法从POST请求中获取对应值
- Django
create_user方法的参数顺序使用错误
修复步骤
1. 修正表单中First Name字段的拼写错误
表单里的First Name输入框name和id属性写成了fisrt_name(拼写少了字母r),而视图里尝试获取的是first_name,两者不匹配直接导致KeyError。修改表单对应部分:
原错误代码:
<label style="color: aliceblue;" for="fisrt_name">First Name</label> <input type="text" id="fisrt_name" class="form-control" name="fisrt_name" placeholder="fisrt name" required>
修正后:
<label style="color: aliceblue;" for="first_name">First Name</label> <input type="text" id="first_name" class="form-control" name="first_name" placeholder="first name" required>
2. 调整create_user方法的参数传递方式
Django内置的User.objects.create_user()方法标准参数顺序为:username作为第一个必填参数,后续依次是email、password,其他额外字段(如first_name、last_name、phone)必须以关键字参数形式传入。另外需要注意:默认Django User模型没有phone字段,你需要确认是否已通过扩展User模型或创建关联Profile模型添加了该字段,否则需先完成模型扩展。
原错误视图代码:
NewUser = User.objects.create_user(first_name, last_name,username, email, password,phone)
修正后(假设已添加phone字段到User模型):
NewUser = User.objects.create_user( username=username, email=email, password=password, first_name=first_name, last_name=last_name, phone=phone )
3. 可选:用request.POST.get()避免KeyError(额外优化)
为防止后续因字段缺失再次触发KeyError,可改用request.POST.get()方法获取值并设置默认值:
first_name = request.POST.get('first_name', '') last_name = request.POST.get('last_name', '') phone = request.POST.get('phone', '')
完整修正后的视图代码
def signup(request): if request.method == "POST": first_name = request.POST.get('first_name', '') last_name = request.POST.get('last_name', '') username = request.POST['username'] email = request.POST['email'] phone = request.POST.get('phone', '') password = request.POST['password'] password2 = request.POST['password2'] if password == password2: if User.objects.filter(username=username).exists(): messages.error(request, "Username already exists.") return render(request, 'registration/signup.html') elif User.objects.filter(email=email).exists(): messages.error(request, "Email already exists.") return render(request, 'registration/signup.html') else: NewUser = User.objects.create_user( username=username, email=email, password=password, first_name=first_name, last_name=last_name, phone=phone ) messages.success(request, "Your account has been successfully created. You will be redirected to the login page.") return redirect('home') else: messages.error(request, "Passwords do not match.") return render(request, 'registration/signup.html') return render(request, 'registration/signup.html')
内容的提问来源于stack exchange,提问作者Man of Light
相关产品推荐
相关产品推荐

