2016-09-20 179 views
1

Django的密码字段输入尽管widget=forms.PasswordInput声明:Django的密码字段输入显示为明文尽管forms.PasswordInput声明显示为明文

forms.py

from django.contrib.auth.models import User 
class LoginForm(forms.ModelForm): 
    # specify password type so that passwords show up as *******, not plaintext 
    # but this doesn't work if placeholder = '' 
    password = forms.CharField(widget=forms.PasswordInput) 

    class Meta: 
     model = User 
     fields = ["username", "password"] 

    def __init__(self, *args, **kwargs): 
     # first call the 'real' __init__() 
     super(LoginForm, self).__init__(*args, **kwargs) 
     # then do extra stuff: 
     self.fields['username'].help_text = '' 
     self.fields['password'].widget = forms.TextInput(attrs={'placeholder': ''}) 
     self.fields['password'].widget.attrs['class'] = 'form-control' 

所以有趣的是,当我面这种形式在模板中,password值显示为纯文本而不是'******'文本。但只有当我添加'placeholder': ''行。我检查了表单元素,并发现当我添加'placeholder': ''行时,type='password'在呈现的HTML中的<input type='FOO'></input>元素中被更改为type='text'

- >如何防止这种情况发生,所以密码会继续显示为纯文本,而不会删除我的'placeholder': ''行?

回答

6

您的密码字段不应该使用forms.TextInputDjango provides a PasswordInput widget这是比较合适的。试试这个:

class Meta: 
    model = User 
    fields = ["username", "password"] 

def __init__(self, *args, **kwargs): 
    # first call the 'real' __init__() 
    super(LoginForm, self).__init__(*args, **kwargs) 
    # then do extra stuff: 
    self.fields['username'].help_text = '' 
    self.fields['password'].widget = forms.PasswordInput(attrs={'placeholder': ''}) 
    self.fields['password'].widget.attrs['class'] = 'form-control' 

尽管您可以手动编辑该字段的类型,但使用该小部件会更好。

+0

不错;比我想出的答案更好! –

+0

(删除我的答案,因为它没有得到根本问题) –

+1

这真的很酷。不过,我在不同的场景中使用了它。谢谢。 –