[英]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"}'
我期望的是:
{"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()
)是否存在某些數據,然后檢查該數據是“ true”還是“ false”?
總而言之,我的問題是:
wtforms.BooleanField
的正確方法是wtforms.BooleanField
? 謝謝。
有許多解決方法。 您可以編寫自己的轉換器,以使用具有正確/錯誤選擇的無線電場,可以使用數據過濾器,可以設置默認值,但是我認為您想要的行為將可以實現:
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.