Django自定义User模型注册时需三次输入密码的问题求助
问题根源及修复方案
核心问题分析
你的代码存在三个关键错误,直接导致了当前的异常:
- 表单字段与模型不匹配:User模型已移除
username并将email设为唯一标识,但SignUpForm里却定义了username字段,提交后无法将表单值映射到模型的email字段,所以创建的用户没有邮箱信息。 - 重复定义密码字段:
UserCreationForm本身已内置password1(密码)和password2(确认密码)字段,你额外手动添加了password字段,这就导致页面出现三个必填密码输入框。 - Meta类字段配置错误:表单Meta里指定的
fields是username,但模型中该字段已被禁用,完全无效。
修正后的SignUpForm代码
from django import forms from django.contrib.auth.forms import AuthenticationForm, UserCreationForm, UserChangeForm from django.forms.widgets import PasswordInput, TextInput from .models import User class CustomAuthForm(AuthenticationForm): username = forms.EmailField(widget=TextInput(attrs={ 'type':'email', 'class':'form-control', 'placeholder': 'Email', })) password = forms.CharField(widget=PasswordInput(attrs={ 'type':'password', 'class':'form-control', 'placeholder':'Password', })) class SignUpForm(UserCreationForm): # 替换原username字段为模型对应的email字段 email = forms.EmailField(widget=TextInput(attrs={ 'type':'email', 'class':'form-control', 'placeholder': 'Email', })) # 仅自定义内置password1和password2的样式,不再重复新增password字段 password1 = forms.CharField(widget=PasswordInput(attrs={ 'type':'password', 'class':'form-control', 'placeholder':'Password', })) password2 = forms.CharField(widget=PasswordInput(attrs={ 'type':'password', 'class':'form-control', 'placeholder':'Reenter Password', })) class Meta: model = User fields = ('email',) # 对应模型的email字段
额外说明
- 修正后表单只会显示
email、password1、password2三个字段,符合正常注册流程。 - 提交时
email字段值会正确映射到User模型的email字段,解决用户无邮箱的问题。 - 认证表单
CustomAuthForm可以保持现状,因为你的User模型用email作为USERNAME_FIELD,Django会自动识别输入的邮箱作为认证标识。
内容的提问来源于stack exchange,提问作者Agustin Gonzalez Ribas
相关产品推荐
相关产品推荐

