在Django中如何创建密码输入框

73

你好,我正在使用django模型类来定义字段,其中包括一个密码字段。但我不想以普通文本的形式显示它,而是想要显示密码输入框。我创建了如下所示的模型类:

class UserForm(ModelForm):
    class Meta:
        password = forms.CharField(widget=forms.PasswordInput)
        model = User
        widgets = {
            'password': forms.PasswordInput(),
        }
但我遇到了以下错误:NameError:名称 'forms' 未定义。
我使用的是Django版本1.4.0。我按照这个链接:Django password problems进行操作。
仍然出现相同的错误。我该怎么办?我错在哪里了。请帮帮我。

我尝试使用PasswordInput作为字段定义,但没有成功。widget=forms.PasswordInput让我的表单正常工作了。 - anno1337
11个回答

96
小部件需要是一个函数调用,而不是属性。你漏掉了括号。
class UserForm(ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())
    class Meta:
        model = User

括号真的必要吗?在初始化期间修复PasswordInput字段,而不是为每个UserForm创建它们,你就可以解决这个问题。 - blacklwhite
2
不是真的,Django使用if isinstance(widget, type): widget = widget()来专门处理这个。 - kibibu
为什么Django为密码创建文本字段?显然应该有一个密码字段用于密码输入吧? - A.J.
2
Django表单中的字段与HTML表单中的字段不同。HTML表单中的字段与Django表单中的_widget_相同。 - Burhan Khalid

59

你需要在导入中包含以下内容:

from django import forms

1
我也尝试过了,现在没有任何错误。但是密码字段仍然得到相同的文本输入。此外,将问题投票降低并不能解决我的问题。 - Dar Hamid
我感谢你的回答。但是我没有错过任何括号之类的东西。而且我已经在模型类中将密码字段的名称与modelForm中的名称相同。无论如何,还是谢谢。 - Dar Hamid

18

为什么不创建自己的密码字段,以便在所有模型中都可以使用呢?

from django import forms 

class PasswordField(forms.CharField):
    widget = forms.PasswordInput

class PasswordModelField(models.CharField):

    def formfield(self, **kwargs):
        defaults = {'form_class': PasswordField}
        defaults.update(kwargs)
        return super(PasswordModelField, self).formfield(**defaults)

所以现在你的模型中使用

password = PasswordModelField()

14

@DrTyrsa是正确的。不要忘记你的括号。

from django.forms import CharField, Form, PasswordInput

class UserForm(Form):
    password = CharField(widget=PasswordInput())

5

4

由于这个问题是几年前提出的,并且在搜索结果中得到很好的索引,因此这个答案可能会帮助一些遇到相同问题但使用更近期Django版本的人。

我正在使用Django 1.11,但它也适用于Django 2.0。


考虑到您正在使用一个名为"user"的模型,我将假设您正在使用Django的默认User()模型。

由于User()模型已经有了密码字段,我们只需向其添加一个小部件即可。

from django import forms
from django.contrib.auth.models import User

# also, it will work with a custom user model if needed.
# from .models import User


class UserRegistrationForm(forms.ModelForm):

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

        widgets = {
            # telling Django your password field in the mode is a password input on the template
            'password': forms.PasswordInput() 
        }

请查看文档

我对Django还不太熟悉,如果我的回答不准确,请告诉我们,我很乐意随后进行编辑。


这对于保护新输入的密码不被显示出来非常有用。但是请注意,这仍然会泄漏现有的密码;用户可以只需“查看源代码”并在HTML中看到未遮盖的密码。 - Nexus
@Nexus 那还有其他方法吗?另外,我在查看源代码或检查元素时没有看到任何表单输入,不确定你是如何看到它们的? - West

2

** 试着使用这个 **

password1 = forms.CharField(widget=forms.PasswordInput(attrs={
    'class': 'input-text with-border', 'placeholder': 'Password'}))
password2 = forms.CharField(widget=forms.PasswordInput(attrs={
    'class': 'input-text with-border', 'placeholder': 'Repeat Password'}))

0
from django import forms

class loginForm(forms.Form):
    username = forms.CharField(
        widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Enter Your userName'}))

    password = forms.CharField(
        widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'please enter password'}))

0

这很简单。

你应该从 Meta 类中获取 password 表单字段。


0

在代码 password = forms.Charfield(widget=forms.PasswordInput) 中,作者所写的是正确的。但它并不属于 class Meta: 部分。相反,它应该位于其上方,并缩进一级,位于 class UserForm 下面....


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接