2014-11-24 49 views
0

我正在驗證我的web應用,這是使用的TurboGears 2.3.3後失蹤,formencode 1.3數據使用@Validate與架構

我想驗證一個動態的形式,用戶通過表單創建創作過程。 我使用json將表單字段從客戶端發送到服務器以幫助組織事情。
這裏是我要送的數據:

var dataToSend = JSON.stringify({ 
     'num_of_copies': num_of_copies.val(), 
     'amountAnswers' : amountAnswers, 
     'yesNoAnswers' : yesNoAnswers, 
     'selectAnswers' : selectAnswers, 
     'comments':comments.val() 
    }) 

    $.ajax({ 
     type: 'POST', 
     url: siteProxy+'orders/saveOrderItem', 
     data: {'data':dataToSend}, 
     dataType: "json", 
     success: function (data, textStatus) { 
      if (textStatus == "success") { 
       if (data.errors){ 
        console.log(data.errors) 
       } 
      } 
     }, 
     error: function (data, textStatus) { 
      alert('error'); 
     } 
    }) 

在我要驗證的數據,然後將服務器做一些東西

@expose('json') 
@validate(validators=orderItemSchema(),error_handler=simpleErrorHandler) 
def saveOrderItem(self,**kw): 
    answers = json.loads(kw['data']) 
    ...... do stuff ... 

沒有驗證,我的代碼工作。

這裏是我的驗證模式:

class orderItemSchema(Schema): 
    def _convert_to_python(self, value_dict, state): 
     value_dict = json.loads(value_dict['data']) 
     super(orderItemSchema,self)._convert_to_python(value_dict, state) 

    num_of_copies = validators.Number(min=1) 
    comments = validators.UnicodeString() 
    amountAnswers = ForEach(AmountAnswerValidator()) 
    yesNoAnswers = ForEach(YesNoAnswerValidator()) 
    selectAnswers = ForEach(SelectAnswerValidator()) 

驗證效果很好。


我的問題是這樣的:驗證後,KW變成沒有,我不能做的東西在

def saveOrderItem(self,**kw): 

我認爲,問題就出在這部分代碼的地方:

class orderItemSchema(Schema): 
    def _convert_to_python(self, value_dict, state): 
     value_dict = json.loads(value_dict['data']) 
     super(orderItemSchema,self)._convert_to_python(value_dict, state) 

感謝您的幫助

回答

1

大概orderItemSchema._convert_to_python缺少返回值。應該是return super(orderItemSchema,self)._convert_to_python(value_dict, state)或者您將返回None作爲轉換後的值。

如果您使用的是最新的tg版本,我建議您也看看@decode_params修飾器(​​),它會從json體中提取控制器參數,並讓驗證流程照常進行。它將避免代碼中的兩個json.load

+0

謝謝, 添加返回值的效果很好。 我也從2.3.3更新了tg版本到2.3.4,但我無法獲得@decode_params來解碼傳入值 – 2014-11-27 09:57:12