2014-05-15 25 views
2

我正在使用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

回答

0

有很多方法可以解決這個問題。你可以寫你自己的轉換器,利用與真/假選項的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