【问题标题】:How to get a Django Prepopulated Model Form for User to *not* populate password如何让用户*不*填充密码的 Django 预填充模型表单
【发布时间】:2015-09-02 03:38:37
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: django django-forms modelform


    【解决方案1】:

    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
    

    【讨论】:

    • 谢谢,这很有帮助。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 1970-01-01
      • 2012-07-20
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多