Nano Hash - криптовалюты, майнинг, программирование

Кастомный валидатор ломает форму смены пароля

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

  • Поделитесь шаблоном. Ничто из того, что вы опубликовали, не должно влиять на рендеринг поля. 25.02.2020
  • @ 4140tm Я добавил его, но, как я уже сказал, шаблон работает нормально, если я удалю пользовательский валидатор из settings.py 25.02.2020
  • Извините, упустил из виду. Я проверил то, чем вы поделились, и не смог воспроизвести описанную проблему. Однако я столкнулся с другим - интерполяция строк в ValidationError выдает другое исключение. 25.02.2020
  • @ 4140tm Спасибо за ваши усилия, мы нашли решение. 25.02.2020

Ответы:


1

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

25.02.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..