【问题标题】:How to create password input field in django如何在 django 中创建密码输入字段
【发布时间】:2012-03-08 15:03:31
【问题描述】:

您好,我正在使用带有一些字段和密码字段的 django 模型类。我不想显示常规的纯文本,而是想显示密码输入。我创建了一个这样的模型类:

class UserForm(ModelForm):
    class Meta:
        password = forms.CharField(widget=forms.PasswordInput)
        model = User
        widgets = {
            'password': forms.PasswordInput(),
        }

但我收到以下错误:NameError: name 'forms' is not defined。

我正在使用 django 版本 1.4.0。我点击了这个链接:Django password problems

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

【问题讨论】:

  • 我尝试使用 PasswordInput 作为字段定义,但没有成功。 widget=forms.PasswordInput 帮我完成了表单工作。

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


【解决方案1】:

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

from django import forms

【讨论】:

  • 我也试过了...我现在没有收到任何错误。但为密码字段获取相同的文本输入。投票否决这个问题也不能解决我的问题。
  • 感谢您的回答。但我没有错过任何括号左右。此外,我已将密码字段的名称放在模型类中,与 modelForm 中的名称相同。谢谢
【解决方案2】:

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

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

【讨论】:

  • 括号真的有必要吗?您只需在初始化期间修复 PasswordInput 字段,而不是为每个 UserForm 重新创建它们。
  • 不是真的,Django 专门用if isinstance(widget, type): widget = widget()处理这个问题
  • 为什么 django 为密码创建文本字段?很明显有一个密码字段用于输入密码?
  • django 表单中的字段与 HTML 表单中的字段不同。 HTML 表单中的字段与 django 表单中的 widget 相同。
【解决方案3】:

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

from django.forms import CharField, Form, PasswordInput

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      这很简单。

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

      【讨论】:

        【解决方案6】:

        我没有任何额外的导入就照做了

        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

        【讨论】:

          【解决方案7】:

          由于这个问题是几年前提出的,并且在搜索结果中被很好地索引,这个答案可能会帮助一些来到这里遇到同样问题但使用更新的 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 很陌生,如果我的回答不够准确,请告诉我们,我很乐意稍后对其进行编辑。

          【讨论】:

          • 这对于保护新输入的密码不被显示非常有用。但是请注意,这仍然会泄漏现有密码;用户可以只“查看源代码”并在 HTML 中看到清晰的密码。
          • @Nexus 那么还有其他方法吗?此外,我在查看源代码或检查不确定您如何查看它们时看不到任何表单输入?
          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            ** 试试这个**

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

            【讨论】:

              【解决方案10】:

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

              注意:如果您只是想对用户隐藏密码,这很好,但是使用 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)
              

              【讨论】:

                【解决方案11】:
                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'}))
                

                【讨论】:

                  猜你喜欢
                  • 2013-07-05
                  • 2011-01-25
                  • 1970-01-01
                  • 2017-11-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多