我制作了 validators.py 并添加了自定义密码验证器,例如检查大写和特殊字符,之后我在 settings.py 中的身份验证密码验证器中添加了这些验证器,如下所示
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
'OPTIONS': {
'max_similarity': 0.7,
'user_attributes': ("username", "first_name", "last_name", "email")
}
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 8,
}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
\# custom coded validators
{
'NAME': 'app1.validators.UppercaseValidator',
},
{
'NAME': 'app1.validators.SpecialCharValidator',
},
]
这是我的forms.py
`
from django import forms from django.contrib.auth.password_validation import validate_password class SignupForm(forms.Form):
firstname = forms.CharField(max_length=20)
lastname = forms.CharField(max_length=20)
email = forms.EmailField()
username = forms.CharField(max_length=30)
password = forms.CharField(widget=forms.PasswordInput, validators=[validate_password])`
在注册时我收到此错误
ImproperlyConfigured at /signup/ The module in NAME could not be imported: app1.validators.UppercaseValidator. Check your AUTH_PASSWORD_VALIDATORS setting.
如有任何帮助,我们将不胜感激
在它根据 django 默认情况下的验证器给我错误之前,但在添加我自己的验证器之后,它给了我我提到的错误
我在运行 django 实例时遇到了同样的问题 它适用于版本 (3, 2, 19, 'final', 0),但它适用于版本 (4, 1, 7, 'final', 0)。 这是我的大写代码:
import re
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _
class UppercaseValidator:
def validate(self, password, user=None):
if not re.findall('[A-Z]', password):
raise ValidationError(
_("The password must contain at least 1 uppercase letter, A-Z."),
code='password_no_upper',
)
def get_help_text(self):
return _(
"Your password must contain at least 1 uppercase letter, A-Z."
)
这是我的设置.py:
AUTH_PASSWORD_VALIDATORS = [
# custom coded validators
{'NAME': 'users.validators.UppercaseValidator',},
...
]
所以我将验证移到了serializer.py中,在settings.py中注释了代码并且它起作用了。 这是我的 serializer.py 的代码:
import re
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _
class CustomRegisterSerializer(RegisterSerializer):
def validate(self, data):
user = User(**data)
password = data.get('password')
try:
if not re.findall('[A-Z]', password):
raise serializers.ValidationError("The password must contain at least 1 uppercase letter, A-Z.")
except Exception as e:
raise serializers.ValidationError("The password must contain at least 1 uppercase letter, A-Z.")
希望可以帮到你!
改变
从 django.utils.translation 导入 ugettext as _
到
从 django.utils.translation 导入 gettext as _
ugettext 显然已被弃用并被 gettext 取代。