亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

表單 Django 中缺少密碼字段?

表單 Django 中缺少密碼字段?

PHP
烙印99 2023-11-09 14:55:51
我想在 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']我以為密碼和確認密碼會默認存在。我說得對嗎?
查看完整描述

2 回答

?
MYYA

TA貢獻1868條經驗 獲得超4個贊

您需要在表單中指定要包含的所有字段:


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


查看完整回答
反對 回復 2023-11-09
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

我以為密碼和確認密碼會默認存在。我說得對嗎?

不可以。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 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']


查看完整回答
反對 回復 2023-11-09
  • 2 回答
  • 0 關注
  • 330 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號