Пользовательский валидатор ломает форму смены пароля - PullRequest
0 голосов
/ 25 февраля 2020

Мы пытаемся добавить специальный валидатор на нашу страницу сброса пароля в 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>

1 Ответ

0 голосов
/ 25 февраля 2020

Мы поняли, что это ошибка отступа функции get_help_text. Ошибка не была должным образом обработана в Django по какой-то причине. Было очень трудно отследить.

...