Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 表单django中缺少密码字段?_Python_Django - Fatal编程技术网

Python 表单django中缺少密码字段?

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

在django身份验证中,我想用电子邮件替换用户名

如果您正在启动一个新项目,强烈建议您设置一个自定义用户模型,即使默认用户模型对您来说已经足够了

首先,我创建了一个自定义用户模型,它扩展了AbstractUser。在这个模型中,我将username=None和username\u FIELD='email'

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我需要在我的表单中手动包含确认密码字段?非常感谢。我明白了。