如何为用户获取 Django 预填充模型表单*不*填充密码

How to get a Django Prepopulated Model Form for User to *not* populate password

我有一个用于用户模型的 ModelForm,我想使用它来允许用户更新他们的一些设置(名字、姓氏、电子邮件,当然还有密码)。这是一个非常基本的形式,我做了 UserForm(instance=user) 这样用户就会看到他们的当前值。然而,它填充了密码字段,这看起来有点疯狂(特别是因为它是散列值 - 并不是我希望显示它们的实际值)。我希望密码留空(我在模型表单中添加了一个额外的字段,因此他们必须输入新密码两次)。

有没有办法指定不应填充此字段?它似乎也默认为 type='text'(查看 html 来源)而不是 type='password'

谢谢

Django ModelForm 具有 widgets 属性,您还可以使用表单小部件 PasswordInput 作为密码字段

假设您已经有了工作视图..所以我在这里跳过完整视图

#views.py
form = UserForm(request.POST, instance = user)

将小部件设置为

#forms.py

widgets = {
            'password':forms.PasswordInput(render_value = True),
        }

并使用init定义初始值

def __init__(self, user, *args, **kwargs):
    user = kwargs.pop('instance')
    super(UserForm, self).__init__(*args, **kwargs)
    self.fields['username'].initial = user.username
    self.fields['first_name'].initial = user.first_name
    self.fields['last_name'].initial = user.last_name
    self.fields['email'].initial = user.email
    self.fields['password'].initial = user.password

你可以重写窗体class的__init__函数,这样每次调用窗体class(构造函数)时,如果窗体用于编辑数据,它不会显示设置任何预填充的密码数据。例如:

class SomeModelForm(forms.ModelForm):
   ...
   def __init__(self, *args, **kwargs):
      super().__init__(*args, **kwargs)
      if self.initial:
          self.fields['password'].initial = ''
          self.fields['retype_password'].initial = ''