DataRequired验证器被破坏wtforms.BooleanField
我正在使用WTForms(与Flask,flask-wtf,sqlalchemy一起)验证传入的JSON for REST API。我意识到WTForms更多地针对HTML表单呈现和验证,但是我选择它是因为它可以自动生成我的sqlalchemy模型(感谢wtforms.ext.sqlalchemy)。DataRequired验证器被破坏wtforms.BooleanField
无论如何,这是问题所在。我的一个模型包括boolean字段,它转换为带有DataRequired验证器的wtforms.BooleanField。问题是,即使我传递了正确的数据,验证也会失败,'此字段是必需的'错误消息。我的表:
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.']}
我知道有一个音符docs,说DataRequired
验证“要求强制数据,而不是输入数据”,但1)该表格是由wtforms.ext.sqlalchemy
自动生成的; 2)如果我使用InputRequired
验证程序,它应该如何表现?检查(通过form.validate()
)一些数据存在,然后检查这个数据是“真”还是“假”?
总之,我的问题是:
- 什么是验证
wtforms.BooleanField
的正确方法是什么? - 也许有一些其他的框架可以验证传入的JSON对给定的sqlalchemy模型?
感谢。
有很多方法可以解决这个问题。你可以写你自己的转换器,利用与真/假选项的radiofield,您可以使用数据过滤器,你可以设置一个默认值,但我想你想的行为将有可能与此:
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()] }
})
如果我传递这样的数据:'''{“disabled”:“foo”}'''到这个表单,验证通过成功,''''form.disabled.data'''''True'' '这是可以的,因为我使用'''InputRequired''',但显然不是我想要的。 – Palasaty
WTForms布尔型字段不能这样工作。它强制任何输入数据为true或false。除''之外的任何字符串数据或位于false_values列表中的字符串数据都将为true。 –
关于你的编辑:我会试试看,谢谢。但是也许你知道,为什么事情对于这么简单的任务来说太复杂了?为什么WTForms对布尔字段的支持不足? – Palasaty
你试过'默认=( '禁用',FALSE)'?因为'disabled'字段的默认值应该是'False'。 – Mortezaipo
我应该在哪里传递这个元组? – Palasaty
对不起,这个元组是'select'标签。试试看:'disabled = BooleanField('disabled',validators = [DataRequired()],defaults = False)' – Mortezaipo