Я пытаюсь добавить пользовательскую проверку пароля для создания пользователя и смены пароля. Я ничего не видел в документах django о том, как это сделать. Я нашел этот пост на SO: Выполняя требования безопасности пароля с помощью django.contrib.auth.views.password_change, который дает 2 решения. Я пробовал обоим, но не работал у меня.
Вот что у меня теперь в моих приложениях 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)
Но у меня все еще была та же ошибка, что и раньше.
Я не могу поверить, что это сложно добавить проверку пароля. Это должна быть очень общая потребность, поэтому я должен упустить что-то простое. Кто-нибудь может оказать некоторую помощь здесь.