Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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
如何获取Django预填充模型表单,以便用户*不*填充密码_Django_Django Forms_Modelform - Fatal编程技术网

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

如何获取Django预填充模型表单,以便用户*不*填充密码,django,django-forms,modelform,Django,Django Forms,Modelform,我有一个用于用户模型的模型表单,我想使用它来允许用户更新他们的一些设置(名字、姓氏、电子邮件,当然还有密码)。这是一个非常基本的表单,我做了UserForm(instance=user)这样用户就可以看到他们的当前值。然而,它填充了password字段,这似乎有点疯狂(特别是因为它是散列值——我不想显示它们的实际值)。我希望密码是空的(我在模型表单中添加了一个额外的字段,所以他们必须输入两次新密码) 是否有办法指定不应填充此字段?它似乎也默认为type='text'(查看html源代码),而不是

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

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


谢谢

Django
ModelForm
具有
widgets
属性,您还可以使用表单widgets密码输入作为密码字段

假设你已经有了工作视图,我跳过了完整视图

#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

您可以重写表单类的
\uuuuu init\uuuu
函数,以便每次调用表单类(构造函数)时,如果表单用于编辑数据,它将不会显示为密码设置任何预填充的数据。例如:

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 = ''

谢谢,这很有帮助。