我正在尝试为create user和change password管理表单添加自定义密码验证。在Django文档中,我没有看到如何做到这一点的任何内容。我在Stack Overflow上找到了这篇文章:Enforcing password strength requirements with django.contrib.auth.views.password_change,其中给出了两个解决方案。我尝试了两种方法,但都没有起作用。
这是我目前在我的应用程序admin.py中拥有的内容:
def validate_password_strength(value):
"""Validates that a password is as least 10 characters long and has at least
2 digits and 1 Upper case letter.
"""
min_length = 10
if len(value) < min_length:
raise ValidationError(_('Password must be at least {0} characters '
'long.').format(min_length))
# check for 2 digits
if sum(c.isdigit() for c in value) < 2:
raise ValidationError(_('Password must container at least 2 digits.'))
# check for uppercase letter
if not any(c.isupper() for c in value):
raise ValidationError(_('Password must container at least 1 uppercase letter.'))
class MySetPasswordForm(SetPasswordForm):
def __init__(self, *args, **kwargs):
super(MySetPasswordForm, self).__init__(*args, **kwargs)
self.fields['password1'].validators.append(validate_password_strength)
但是我想不通的是,怎样才能使用 MySetPasswordForm。
我尝试了几种不同的方法。首先,我做了这个:
class UserAdmin(UserAdmin):
form = MySetPasswordForm
# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
我遇到了这个错误:
<class 'elex_apis.energy.webservice.admin.UserAdmin'>: (admin.E016) The value of 'form' must inherit from 'BaseModelForm'.
那么我将MySetPasswordForm更改为继承自BaseModelForm,然后就出现了以下错误:
__init__() missing 1 required positional argument: 'user'
所以我添加了用户参数,现在MySetPasswordForm看起来像这样:
class MySetPasswordForm(BaseModelForm):
def __init__(self, user, *args, **kwargs):
super(MySetPasswordForm, self).__init__(user, *args, **kwargs)
self.fields['password1'].validators.append(validate_password_strength)
但我仍然得到了之前相同的错误。
我简直不敢相信添加密码验证器会这么难。这肯定是一个非常普遍的需求,所以显然我必须漏掉了一些简单的东西。请问有人能够在这里提供一些帮助吗?
返回值
了,请使用新版本尝试 :) - Wolph