我使用WTForms (连同烧瓶、烧瓶-wtf、sqlalchemy)来验证REST传入的JSON。我意识到WTForms更多地针对HTML的呈现和验证,但我选择它是因为它可以从我的sqlalchemy模型中自动生成表单(多亏了wtforms.ext.sqlalchemy)。
不管怎样,问题就在这里。我的模型之一包括布尔字段,它通过DataRequired验证器转换为DataRequired。问题是,即使我传递正确的数据,“此字段是必需的”错误信息也会导致验证失败。我的表格:
class MyForm(Form):
name = TextField('name', validators=[DataRequired()])
disabled = BooleanField('disabled', validators=[DataRequired()])
JSON数据如下所示:
'{"name": "John", "disabled": "false"}'
我期待的是:
{"disabled": "false"}
->验证成功的、胁迫的Python数据:{'disabled': False}
{"disabled": "true"}
->验证成功的、胁迫的Python数据:{'disabled': True}
{"disabled": ""}
或'{"disabled": "foo"}'
->验证失败目前,在第一次验证中,{'disabled': [u'This field is required.']}
失败了。
我知道文档中有一条注释说,DataRequired
验证器“需要被胁迫的数据,而不是输入数据”,但是1)表单是由wtforms.ext.sqlalchemy
自动生成的,2)如果我使用InputRequired
验证器,它应该如何运行?检查(通过form.validate()
)某些数据是否存在,然后检查该数据是否为“真”或“假”?
总之,我的问题是:
wtforms.BooleanField
的正确方法是什么?谢谢。
发布于 2014-05-15 08:23:12
有很多方法可以解决这个问题。您可以编写自己的转换器,以便使用具有真/假选择的无线电场,您可以使用数据过滤器,您可以设置默认值,但我认为您想要的行为将是可能的:
MyForm = model_form(MyModel, db_session=db, field_args = {
'disabled' : {
'false_values': ['false'],
'validators' : [InputRequired()] }
})
编辑:如果需要更严格的处理程序,可以执行以下操作:
class BooleanRequired(object):
field_flags = ('required', )
def __init__(self, message=None):
self.message = message
def __call__(self, form, field):
if field.data is None:
if self.message is None:
message = field.gettext('This field is required.')
else:
message = self.message
field.errors[:] = []
raise StopValidation(message)
class StrictBooleanField(BooleanField):
def process_formdata(self, valuelist):
self.data = None
if valuelist:
if valuelist[0] == 'false':
self.data = False
elif valuelist[0] == 'true':
self.data = True
class StrictModelConverter(ModelConverter):
@converts('Boolean')
def conv_Boolean(self, field_args, **extra):
return StrictBooleanField(**field_args)
MyForm = model_form(MyModel, db_session=db, converter=StrictModelConverter(),
field_args = { 'disabled' : { 'validators': [BooleanRequired()] }
})
https://stackoverflow.com/questions/23681846
复制