【问题标题】:Django - Adding password validations in a ModelFormDjango - 在 ModelForm 中添加密码验证
【发布时间】:2018-05-30 00:50:31
【问题描述】:

我在 Django 中制作了一个 ModelForm 用于注册新用户。它有 4 个字段(usernameemailpasswordconfirm_password)。我想为password 字段添加一些验证。例如,如果密码少于 8 个字符或密码与用户名相似,则引发错误消息。我该怎么做?

这是我的forms.py 文件:

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

class user_form(forms.ModelForm):
    password = forms.CharField(widget = forms.PasswordInput)
    confirm_password = forms.CharField(widget = forms.PasswordInput)

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

我的settings.py 已经包含以下验证器:

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimila‌​rityValidator', 
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValida‌​tor',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValid‌​ator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordVali‌​dator',
    }
]

它已经在settings.py 中,但我的表单密码没有得到验证。

【问题讨论】:

  • 您是否尝试过覆盖密码清除方法?
  • 我该怎么做?
  • @Hashir Sarwar 我更新了我的答案以解释如何在验证表单时触发密码验证。

标签: python django django-forms


【解决方案1】:

您需要阅读有关 Password Validation 的 Django 文档。

总而言之,您需要更新settings.py 中的AUTH_PASSWORD_VALIDATORS 设置。

Django 带有一些内置的密码验证器:

  1. UserAttributeSimilarityValidator(检查密码与用户的一组属性之间的相似性)
  2. MinimumLengthValidator(检查密码是否满足最小长度)
  3. CommonPasswordValidator(检查密码是否出现在常用密码列表中)
  4. NumericPasswordValidator(检查密码是否不全是数字)

根据您在问题中陈述的示例验证,您需要使用 MinimumLengthValidatorUserAttributeSimilarityValidator

由于您使用的是表单,因此您需要在验证表单时通过调用django.contrib.auth.password_validation.validate_password 手动触发密码验证,如Django docs 中所述。

【讨论】:

  • 我必须在views.py中添加这些功能?
  • 无论您在哪里验证表单,都需要执行以下操作 1. 导入 django.contrib.auth.password_validation 2. 致电 validate_password 如果您编辑问题以显示您在哪里进行表单验证,我可以提供帮助告诉你在哪里添加对validate_password的调用。
  • 我的声望不够。 :)
  • validate_password() 仅检查密码是否为 8 个字符长。如何检查CommonPasswordValidatorNumericPasswordValidator 等其他因素?
  • @HashirSarwar 如果您写一个包含新问题详细信息的新问题,我很乐意提供帮助。如果您这样做,请在此处分享链接。
【解决方案2】:

在 forms.py 文件中,您可以使用它来验证设置中定义的所有验证的密码。如果您没有在设置文件中定义任何验证器,则调用您要验证的特定验证器。

from django.contrib.auth.password_validation import validate_password`
from django.core import validators
from django import forms
class User_profileForm(forms.ModelForm):
password=forms.CharField(widget=forms.PasswordInput,validators=[validate_password])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-30
    • 2016-04-09
    • 2011-01-13
    • 2014-08-12
    • 2013-11-26
    • 2013-08-22
    • 2011-01-09
    相关资源
    最近更新 更多