如何在django中创建密码输入字段

时间:2012-02-17 07:26:41

标签: django django-models django-forms django-templates django-views

您好我正在使用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

仍然得到同样的错误。我该怎么办。我哪里出错了。请帮忙

11 个答案:

答案 0 :(得分:58)

小部件需要是函数调用,而不是属性。你缺少括号。

class UserForm(ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())
    class Meta:
        model = User

答案 1 :(得分:55)

您需要在导入中包含以下内容;

from django import forms

答案 2 :(得分:16)

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

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()

答案 3 :(得分:14)

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

from django.forms import CharField, Form, PasswordInput

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

答案 4 :(得分:3)

我做了一个没有任何额外导入的跟随

from django import forms
class Loginform(forms.Form):
    attrs = {
        "type": "password"
    }
    password = forms.CharField(widget=forms.TextInput(attrs=attrs))

这个想法来源于源代码: https://docs.djangoproject.com/en/2.0/_modules/django/forms/fields/#CharField

答案 5 :(得分:2)

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

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


考虑到您使用的是模型用户,我将假定您使用的是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() 
        }

Check the docs

我对Django还是很陌生,如果我的回答不够准确,请告诉我们,我很乐意稍后对其进行编辑。

答案 6 :(得分:0)

非常简单。

您应该从password课程中获取Meta表单字段。

答案 7 :(得分:0)

OP在password = forms.Charfield(widget=forms.PasswordInput)写的内容是正确的。它只是不属于class Meta:部分。相反,它应该在它上面,在class UserForm下面缩进一层。...

答案 8 :(得分:0)

**尝试使用此**

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'}))

答案 9 :(得分:0)

如果该字段可以为空,则上述解决方案有效。使用 render_value 会将密码呈现到输入字段中,并将值显示为星号占位符。

注意:如果您只是想对用户隐藏密码,这很好,但密码可以通过使用 javascript 读取。

class UserForm(forms.ModelForm):
    class Meta:
        model = Org
        fields = '__all__'

        widgets = {
            'password': forms.PasswordInput(render_value=True),
        }

编辑:

找到了一个更好的解决方案而不暴露当前密码。 PASSWORD_ASTERIX_PLACEHOLDER 将在加载输入时设置为值。在保存模型之前,如果用户没有设置明确的新密码,它会将值恢复为旧的。

表单输入:

class PrefilledPasswordInput(PasswordInput):
    PASSWORD_ASTERIX_PLACEHOLDER: str = 'hidden-password'

    def __init__(self, attrs: dict = None, *args, **kwargs):
        if not attrs:
            attrs = {}
        attrs.setdefault('value', PrefilledPasswordInput.PASSWORD_ASTERIX_PLACEHOLDER)
        super().__init__(attrs=attrs, *args, **kwargs)

模型字段:

class PasswordCharField(models.CharField):
    def to_python(self, value):
        return super().to_python(value)

    def pre_save(self, model_instance, add):
        attr_name = self.get_attname()

        if not add:
            # Reset to old value if matching with PASSWORD_ASTERIX_PLACEHOLDER
            old_instance = self.model.objects.get(id=model_instance.id)
            current_value: str = getattr(model_instance, attr_name)
            if current_value == PrefilledPasswordInput.PASSWORD_ASTERIX_PLACEHOLDER:
                old_value: str = getattr(old_instance, attr_name)
                setattr(model_instance, attr_name, old_value)

        return super().pre_save(model_instance, add)

您的管理员-(表单):

class UserForm(forms.ModelForm):
    class Meta:
        model = Org
        fields = '__all__'

        widgets = {
            'password': PrefilledPasswordInput(),
        }

您的模型:

class User(SomeBaseModel):
    ...
    password = PasswordCharField(max_length=32, null=False, blank=False)

答案 10 :(得分: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'}))