Skip to main content
 首页 » 编程设计

python之尽管有 forms.PasswordInput 声明,但 Django 密码字段输入显示为纯文本

2025年05月04日34xing901022

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

表格.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'正在更改为 type='text'在<input type='FOO'></input>呈现的 HTML 中的元素。

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

请您参考如下方法:

您不应该使用 forms.TextInput 作为您的密码字段。 Django 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' 

虽然您可以手动编辑字段的类型,但最好还是使用小部件。