Django密码字段输入尽管form.PasswordInput声明显示为明文

Hil*_*ers 1 python forms django

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

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'
Run Code Online (Sandbox Code Playgroud)

有趣的是,当我在模板中password显示此表单时,该值显示为明文而不是"******"文本.但只有我添加了这'placeholder': ''条线.我检查了表单元素并发现当我添加该 'placeholder': ''行时,type='password'正在被渲染的HTML type='text'中的<input type='FOO'></input>元素中更改为.

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

tre*_*zko 6

您不应该使用forms.TextInput您的密码字段.Django提供了更合适的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.PasswordInput(attrs={'placeholder': ''})
    self.fields['password'].widget.attrs['class'] = 'form-control'
Run Code Online (Sandbox Code Playgroud)

虽然您可以手动编辑字段的类型,但最好使用窗口小部件.