DataRequired验证器被破坏wtforms.BooleanField

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"}' 

我很期待:

  1. {"disabled": "false"} - >验证带成功,胁迫Python数据:{'disabled': False}
  2. {"disabled": "true"} - >验证成功,强制的Python数据:{'disabled': True}
  3. {"disabled": ""}'{"disabled": "foo"}' - >验证失败

目前在第一种情况下验证失败,{'disabled': [u'This field is required.']}

我知道有一个音符docs,说DataRequired验证“要求强制数据,而不是输入数据”,但1)该表格是由wtforms.ext.sqlalchemy自动生成的; 2)如果我使用InputRequired验证程序,它应该如何表现?检查(通过form.validate()一些数据存在,然后检查这个数据是“真”还是“假”?

总之,我的问题是:

  1. 什么是验证wtforms.BooleanField的正确方法是什么?
  2. 也许有一些其他的框架可以验证传入的JSON对给定的sqlalchemy模型?

感谢。

+0

你试过'默认=( '禁用',FALSE)'?因为'disabled'字段的默认值应该是'False'。 – Mortezaipo

+0

我应该在哪里传递这个元组? – Palasaty

+0

对不起,这个元组是'select'标签。试试看:'disabled = BooleanField('disabled',validators = [DataRequired()],defaults = False)' – Mortezaipo

有很多方法可以解决这个问题。你可以写你自己的转换器,利用与真/假选项的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()] } 
}) 
+0

如果我传递这样的数据:'''{“disabled”:“foo”}'''到这个表单,验证通过成功,''''form.disabled.data'''''True'' '这是可以的,因为我使用'''InputRequired''',但显然不是我想要的。 – Palasaty

+0

WTForms布尔型字段不能这样工作。它强制任何输入数据为true或false。除''之外的任何字符串数据或位于false_values列表中的字符串数据都将为true。 –

+0

关于你的编辑:我会试试看,谢谢。但是也许你知道,为什么事情对于这么简单的任务来说太复杂了?为什么WTForms对布尔字段的支持不足? – Palasaty