表单 Django 中缺少密码字段?

我想在 django 身份验证中将用户名替换为电子邮件。所以当我浏览文档时,它说


如果要开始一个新项目,强烈建议设置自定义用户模型,即使默认用户模型对你来说已经足够了


因此,首先我创建了一个自定义用户模型,该模型扩展了我 AbstractUser.In 我将其设置为username=None和USERNAME_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']

我以为密码和确认密码会默认存在。我说得对吗?


烙印99
浏览 129回答 2
2回答

MYYA

您需要在表单中指定要包含的所有字段:class UserForm(forms.ModelForm):  password = forms.CharField(widget=forms.PasswordInput())  password_confirm = forms.CharField(widget=forms.PasswordInput())  class Meta:    fields = ['email', 'password']  def clean(self):    cleaned_data = super().clean()    password = cleaned_data.get("password")    password_confirm = cleaned_data.get("password_confirm")    if password != password_confirm:        self.add_error('password_confirm', "Password does not match")    return cleaned_data但请注意,您需要手动验证字段是否与字段匹配password_confirmpassword

一只甜甜圈

我以为密码和确认密码会默认存在。我说得对吗?不可以。A 具有基于您提供的模型构造 A 的逻辑。但它不会将用户模型与另一个模型区别对待。如果指定 ,它将只创建一个包含该字段的表单,作为唯一的表单。ModelFormFormfields = ['email']email更糟糕的是,它不会创建正确的用户对象,因为密码应该被哈希化,你可以用 .set_password(...) 方法 [Django-doc] 存储哈希密码。因此,我们可以创建一个如下所示的表单: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']如果要验证密码,则需要添加一些额外的逻辑:from django.core.exceptions import ValidationErrorclass 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']
打开App,查看更多内容
随时随地看视频慕课网APP