Переопределение FlaskForm.validate () не пропускает POST-запрос - PullRequest
0 голосов
/ 30 июня 2019

РЕЗЮМЕ

Я пытаюсь сохранить 3 значения с плавающей запятой, кроме значения String; но перед этим я хотел бы проверить FloatFields, проверяя друг друга.

Это 3 индикатора - Хороший, Средний и Плохой, и я включил валидаторы.NumberRange в [-1, 1]. Это работает нормально, поэтому, если я вхожу за пределы диапазона, в моем шаблоне отображается сообщение об ошибке по умолчанию, которое нужно ввести в пределах -1 и 1

Теперь я должен проверить, что индикаторы Good, Average и Poor находятся в порядке убывания, прежде чем добавлять их в БД.

КОД

FORM:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, FloatField
from wtforms.validators import DataRequired, Length, ValidationError, NumberRange
from .models import Crop


# FORMS RENDERED TO CORRESPONDING WEB TEMPLATES IN DEFINED VIEWS

class CropForm(FlaskForm):
    crop_name = StringField("Crop Name", validators=[DataRequired(), Length(max=80)])
    good_threshold = FloatField("Good", validators=[DataRequired(), NumberRange(min=-1, max=1)])
    average_threshold = FloatField("Average", validators=[DataRequired(), NumberRange(min=-1, max=1)])
    poor_threshold = FloatField("Poor", validators=[DataRequired(), NumberRange(min=-1, max=1)])
    submit = SubmitField("Submit")

    def validate_crop_name(self, crop_name):  # IGNORE THIS
        crop = Crop.query.filter_by(crop_name=str(crop_name.data).casefold().replace(" ", "").capitalize()).first()
        if crop:
            raise ValidationError("Crop with the name already exists")

    def validate(self, *args, **kwargs):
        super(CropForm, self).validate(*args, **kwargs)
        good_input = self.good_threshold.raw_data
        average_input = self.average_threshold.raw_data
        poor_input = self.poor_threshold.raw_data
        if good_input < average_input:
            self.average_threshold.errors.append("Average cannot be more than Good Indicator")
        if good_input < poor_input:
            self.poor_threshold.errors.append("Poor cannot be more Good indicator")
        if average_input < poor_input:
            self.poor_threshold.errors.append("Poor cannot be more Average indicator")

Когда я удаляю / комментирую блок validate () в CropForm FORM, я могу отправлять отправлять непроверенные значения, такие как Good = 0.5, Average = 0.8, Poor = 0.9, в БД, что я не предпочитаю , поскольку они не в порядке убывания

Когда я оставляю все как есть / раскомментирую, проверяю блок () в CropForm FORM, отправляю допустимые значения, такие как Good = 0,9, Среднее = 0,8, Плохое = 0,5, и я нажимаю кнопку отправки в шаблоне, это не в все отправляющие значения t db

МОДЕЛЬ:

class Crop(db.Model):
    id = db.Column(db.Integer, primary_key=True, unique=True, nullable=False)
    crop_name = db.Column(db.String, unique=True, nullable=False)
    good_threshold = db.Column(db.Float)
    average_threshold = db.Column(db.Float)
    poor_threshold = db.Column(db.Float)


    def __repr__(self):
        return f"{self.id}.{self.crop_name}"

VIEW:

@app.route("/crops", methods=["POST", "GET"])
    def crops():
        form = CropForm()
        if form.validate_on_submit():
            crop_info = Crop(crop_name=str(form.crop_name.data).casefold().replace(" ", "").capitalize(),
                             good_threshold=form.good_threshold.data,
                             average_threshold = form.average_threshold.data,
                             poor_threshold=form.poor_threshold.data)
            db.session.add(crop_info)
            db.session.commit()
            flash(f"Thresholds added, check record #{crop_info.id}", 'success')
            return redirect(url_for('crops'))
        records = Crop.query.order_by(Crop.id)
        return render_template('crop_thresholds.html', title="Crop Thresholds", form=form, records=records)

1 Ответ

0 голосов
/ 30 июня 2019

Вы можете попробовать заменить функцию проверки на что-то вроде этого

def validate(self, *args, **kwargs):
    super(CropForm, self).validate(*args, **kwargs)
    good_input = self.good_threshold.raw_data
    average_input = self.average_threshold.raw_data
    poor_input = self.poor_threshold.raw_data
    all_okay = True
    if good_input < average_input:
        self.average_threshold.errors.append("Average cannot be more than Good Indicator")
        all_okay = False
    if good_input < poor_input:
        self.poor_threshold.errors.append("Poor cannot be more Good indicator")
        all_okay = False
    if average_input < poor_input:
        self.poor_threshold.errors.append("Poor cannot be more Average indicator")
        all_okay = False
    return all_okay

Идея состоит в том, что функция проверки будет определять, должна ли проверка быть успешной или нет, в зависимости от того, будет ли возвращено True или False. Таким образом, если какой-либо из операторов if потерпит неудачу, all_okay будет False и проверка не пройдена. В противном случае проверка должна пройти, и вы сможете продолжить ввод if form.validate_on_submit(): кодового блока

...