簡體   English   中英

wtforms.BooleanField的DataRequired驗證器損壞

[英]DataRequired validator is broken for wtforms.BooleanField

我正在使用WTForms(以及Flask,flask-wtf,sqlalchemy)來驗證REST API的傳入JSON。 我意識到WTForms的目標更多是針對HTML表單呈現和驗證,但我之所以選擇它是因為它可以從我的sqlalchemy模型中自動生成表單(這要歸功於wtforms.ext.sqlalchemy)。

無論如何,這就是問題所在。 我的模型之一包括布爾字段,該字段使用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.']}

我知道文檔中有一條說明說DataRequired驗證程序“需要強制數據,而不是輸入數據”,但是1)表單是由wtforms.ext.sqlalchemy自動生成的,並且2)如果我使用InputRequired驗證程序應該如何表現? 檢查(通過form.validate() )是否存在某些數據,然后檢查該數據是“ true”還是“ false”?

總而言之,我的問題是:

  1. 驗證wtforms.BooleanField的正確方法是wtforms.BooleanField
  2. 也許還有其他框架可以針對給定的sqlalchemy模型驗證傳入的JSON?

謝謝。

有許多解決方法。 您可以編寫自己的轉換器,以使用具有正確/錯誤選擇的無線電場,可以使用數據過濾器,可以設置默認值,但是我認為您想要的行為將可以實現:

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()] }
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM