Код валидатора для формы WTForms, которая сравнивает входные данные из двух полей - PullRequest
0 голосов
/ 09 июня 2019

Я хотел бы иметь валидатор, который запускает ValidationException, когда вход для feature_count меньше, чем для effective_rank.

Я нашел информацию на этом сайте (http://flask.pocoo.org/snippets/64/) о валидаторах wtforms, но не знаете, как применить это к моей проблеме.

Можете ли вы показать мне, как это делается?

Это мой код:

from flask_wtf import FlaskForm
from wtforms import SubmitField, IntegerField, ValidationError
from wtforms.validators import DataRequired, NumberRange, EqualTo,


class RequestDataForm(FlaskForm):
feature_count = IntegerField('Number of features', validators=[DataRequired(), NumberRange(min=1, max=50)])

effective_rank = IntegerField('Effective Rank', validators=[DataRequired()])

noise = IntegerField('Noise', validators=[DataRequired(), NumberRange(min=0, max=1)])

submit = SubmitField('Submit')

1 Ответ

1 голос
/ 09 июня 2019

Существует Validator, называемый EqualTo, который можно использовать для сравнения равенства двух полей. Если вы хотите, чтобы feature_count был таким же, как effective_rank, вам просто нужно добавить:

feature_count = IntegerField('Number of features', validators=[DataRequired(), EqualTo('effective_rank'), NumberRange(min=1, max=50)])

Однако в вашем конкретном случае вы хотите обеспечить LessThan, поэтому лучшее решение, которое у меня есть, - это скопировать и вставить код для класса EqualTo, переименовать его для вашего конкретного случая, изменить сравнение и повторно использовать это как пользовательский класс:

class EqualTo(object):  # --> Change to 'LessThan'
    """
    Compares the values of two fields.

    :param fieldname:
        The name of the other field to compare to.
    :param message:
        Error message to raise in case of a validation error. Can be
        interpolated with `%(other_label)s` and `%(other_name)s` to provide a
        more helpful error.
    """
    def __init__(self, fieldname, message=None):
        self.fieldname = fieldname
        self.message = message

    def __call__(self, form, field):
        try:
            other = form[self.fieldname]
        except KeyError:
            raise ValidationError(field.gettext("Invalid field name '%s'.") % self.fieldname)
        if field.data != other.data:  #  --> Change to >= from !=
            d = {
                'other_label': hasattr(other, 'label') and other.label.text or self.fieldname,
                'other_name': self.fieldname
            }
            message = self.message
            if message is None:
                message = field.gettext('Field must be equal to %(other_name)s.')

            raise ValidationError(message % d)

Тогда вы можете использовать:

feature_count = IntegerField('Number of features', validators=[DataRequired(), LessThan('effective_rank'), NumberRange(min=1, max=50)])
...