Мы пытаемся добавить собственный валидатор на нашу страницу сброса пароля в Django 1.11.18. Ниже представлена упрощенная версия того, что мы реализовали. Однако кажется, что в форме, отображающей страницу сброса пароля, есть необычный побочный эффект. Я ожидаю 3 поля, old_password
, new_password1
и new_password2
, но new_password1
не отображается на странице. Мы используем почти все функции смены пароля Django по умолчанию, как показано в views.py ниже. Если валидатор убрать из настроек, форма работает как положено.
Почему валидатор ломает форму?
myvalidator.py
import re
from django.conf import settings
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
class MyValidator(object):
message = _("Password is not complex enough (%s)")
code = "complexity"
def __init__(self, complexities=None):
self.complexities = complexities
def validate(self, password, user=None):
errors = []
if password == '12345678':
errors.append(_("Password must be 12345678"))
if errors:
raise ValidationError(self.message % (_(u'must contain ') + u', '.join(errors),),
code=self.code)
def get_help_text(self):
return _(
"Your password must contain 12345678"
)
views.py
class PasswordChangeView(views.PasswordChangeView):
template_name = 'accounts/password_change.html'
settings.py
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'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',
},
{
'NAME': 'the.path.to.myvalidator.MyValidator',
},
]
password_change.html
<form action="" method="post">
{% csrf_token %}
<div class="row mb20">
<div class="col-md-6">
<label class="pb5" for="{{ form.old_password.id_for_label }}"
>{{ form.old_password.label }}</label
>
{{ form.old_password }} {{ form.old_password.errors }}
</div>
</div>
<div class="row mb20">
<div class="col-md-6">
<label class="pb5" for="{{ form.new_password1.id_for_label }}"
>{{ form.new_password1.label }}</label
>
{{ form.new_password1 }} {{ form.new_password1.errors }}
</div>
</div>
<div class="row mb20">
<div class="col-md-6">
<label class="pb5" for="{{ form.new_password2.id_for_label }}"
>{{ form.new_password2.label }}</label
>
{{ form.new_password2 }} {{ form.new_password2.errors }}
</div>
</div>
<div class="clearfix mt20 text-right">
<button type="submit" class="btn btn-sf-lightblue ml10">
<span class="fa fa-floppy-o"></span> Change my password
</button>
</div>
</form>