Jesvin Jose
Jesvin Jose

Reputation: 23078

Flask-WTForms: Boolean and InputRequired cause issues with each other

I have defined a boolean field like below.

f = BooleanField(validators=[InputRequired()], false_values=(False, 'false', 'False', ''))

The inputs are python objects like {"f" : False} since they are JSON submits.

form = LocationEditForm(obj=request.get_json())

This form handles inputs:

It seems that InputRequired must verify if that field exists and False input triggers the "field does not exist" code path.

How do I fix it?

I need InputRequired to trigger error when the field has not been submitted.

Upvotes: 1

Views: 475

Answers (1)

Jesvin Jose
Jesvin Jose

Reputation: 23078

Code meant to check if not [truthy value] accidentally triggers as if not False, so I forked InputRequired. Also BooleanField considers "false" and "" as the only falsy values. So include False as falsy.

Define these:

class BooleanRequired(object):
    """
    Fork of wtforms.validators.InputRequired
    """
    field_flags = ('required', )

    def __init__(self, message=None):
        self.message = message

    def is_correct(self, raw_data):
        try:
            return raw_data[0] in [True, False]
        except TypeError:
            return raw_data in [True, False]

    def __call__(self, form, field):
        if not self.is_correct(field.raw_data):
            if self.message is None:
                message = field.gettext('This field is required.')
            else:
                message = self.message

            field.errors[:] = []
            raise StopValidation(message)


BOOLEAN_KWARGS = {
    'validators': [BooleanRequired(message="message")],
    'false_values': (False,)
}

Use like:

a = BooleanField(**BOOLEAN_KWARGS)

Upvotes: 1

Related Questions