Python 表单django中缺少密码字段?
在django身份验证中,我想用电子邮件替换用户名 如果您正在启动一个新项目,强烈建议您设置一个自定义用户模型,即使默认用户模型对您来说已经足够了 首先,我创建了一个自定义用户模型,它扩展了AbstractUser。在这个模型中,我将username=None和username\u FIELD='email'Python 表单django中缺少密码字段?,python,django,Python,Django,在django身份验证中,我想用电子邮件替换用户名 如果您正在启动一个新项目,强烈建议您设置一个自定义用户模型,即使默认用户模型对您来说已经足够了 首先,我创建了一个自定义用户模型,它扩展了AbstractUser。在这个模型中,我将username=None和username\u FIELD='email' class User(AbstractUser): username = None first_name = None last_name = None e
class User(AbstractUser):
username = None
first_name = None
last_name = None
email = models.EmailField(unique=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
然后我创建了一个使用自定义用户模型的模型表单。当我在模板中呈现此表单时,密码和确认密码字段丢失。我不知道出了什么问题
class UserForm(forms.ModelForm):
class Meta:
model = get_user_model()
fields = ['email']
我以为默认情况下密码和确认密码都会在那里。我说的对吗?您需要在表单中指定所有您想要的字段:
class用户表单(forms.ModelForm):
password=forms.CharField(widget=forms.PasswordInput())
password\u confirm=forms.CharField(widget=forms.PasswordInput())
类元:
字段=['email','password']
def清洁(自清洁):
cleaned_data=super().clean()
password=已清理的数据。获取(“密码”)
password\u confirm=已清理的数据。获取(“password\u confirm”)
如果输入密码!=密码确认:
self.add\u错误(“密码确认”,“密码不匹配”)
返回已清除的数据
但是请注意,您需要手动验证password\u confirm
字段是否与password
字段匹配
我以为默认情况下密码和确认密码会在那里,对吗
否。ModelForm
具有基于您提供的模型构造表单的逻辑。但它对待用户模型与对待另一个模型没有区别。如果指定fields=['email']
,它只需创建一个表单,其中只有email
字段
更糟糕的是,它不会创建正确的用户对象,因为应该对密码进行散列,所以可以将散列后的密码与存储在一起。因此,我们可以创建一个如下所示的表单:
class UserCreateForm(forms.ModelForm):
password = forms.CharField(
label='Password',
strip=False,
widget=forms.PasswordInput()
)
def save(self, *args, **kwargs):
self.instance.set_password(self.cleaned_data['password'])
return super().save(*args, **kwargs)
class Meta:
model = get_user_model()
fields = ['email']
class UserCreateForm(forms.ModelForm):
密码=forms.CharField(
label='Password',
strip=False,
widget=forms.PasswordInput()
)
def保存(自身、*args、**kwargs):
self.instance.set_密码(self.cleaned_数据['password']))
return super().save(*args,**kwargs)
类元:
模型=获取用户模型()
字段=['email']
如果要验证密码,需要添加一些额外的逻辑:
from django.core.exceptions import ValidationError
class UserCreateForm(forms.ModelForm):
password = forms.CharField(
label='Password',
strip=False,
widget=forms.PasswordInput()
)
password2 = forms.CharField(
label='Repeat password',
strip=False,
widget=forms.PasswordInput()
)
def clean(self, *args, **kwargs):
cleaned_data = super().clean(*args, **kwargs)
if cleaned_data['password'] != cleaned_data['password2']:
raise ValidationError('Passwords do not match')
return cleaned_data
def save(self, *args, **kwargs):
self.instance.set_password(self.cleaned_data['password'])
return super().save(*args, **kwargs)
class Meta:
model = get_user_model()
fields = ['email']
来自django.core.exceptions的导入验证错误
类UserCreateForm(forms.ModelForm):
密码=forms.CharField(
label='Password',
strip=False,
widget=forms.PasswordInput()
)
password2=forms.CharField(
label='Repeat password',
strip=False,
widget=forms.PasswordInput()
)
def清洁(自身,*args,**kwargs):
已清理的_data=super().clean(*args,**kwargs)
如果清除了_数据['password']!=已清除的_数据['password2']:
引发ValidationError('密码不匹配')
返回已清除的数据
def保存(自身、*args、**kwargs):
self.instance.set_密码(self.cleaned_数据['password']))
return super().save(*args,**kwargs)
类元:
模型=获取用户模型()
fields=['email']
如果您设置了fields=['email']
否。为什么希望显示密码字段?是否要使用此表单创建用户或登录用户?@WillemVanOnsem是。我要使用此表单创建用户。是什么PDo我需要在我的表单中手动包含确认密码字段?非常感谢。我明白了。