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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:41:01