Flask-WTForms:Boolean和InputRequired引起彼此的问题

时间:2015-09-16 12:25:30

标签: wtforms flask-wtforms

我已经定义了一个布尔字段,如下所示。

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

输入是{"f" : False}之类的python对象,因为它们 JSON提交

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

此表单处理输入:

  • 是的," true"正确地
  • "假"正确地
  • 错误触发InputRequired错误

似乎InputRequired必须验证该字段是否存在,而False输入触发"字段不存在"代码路径。

我该如何解决?

我还需要InputRequired才能在未提交字段时触发错误。

1 个答案:

答案 0 :(得分:1)

代码意味着将if not [truthy value]意外触发检查为if not False,因此我分叉了InputRequired。此外,BooleanField将"false"""视为唯一的虚假值。因此,请将False包括为falsy。

定义这些:

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,)
}

使用类似:

a = BooleanField(**BOOLEAN_KWARGS)