Reputation: 23078
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
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