2014-10-27 27 views
0

我使用的TurboGears 2.3和與formencode驗證形式工作,需要一些指導的TurboGears 2.3分兩步@validte

我有覆蓋2個不同的對象的形式。他們是幾乎相同,但也有一些差異 當我提交我的形式,我想驗證兩件事情

  1. 一些基本數據
  2. 一些具體數據,特定對象

這裏是我的模式:

class basicQuestionSchema(Schema): 
    questionType = validators.OneOf(['selectQuestion', 'yesNoQuestion', 'amountQuestion']) 
    allow_extra_fields = True 


class amount_or_yes_no_question_Schema(Schema): 
    questionText = validators.NotEmpty() 
    product_id_radio = object_exist_by_id(entity=Product, not_empty=True) 
    allow_extra_fields = True 


class selectQuestionSchema(Schema): 
    questionText = validators.NotEmpty() 
    product_ids = validators.NotEmpty() 
    allow_extra_fields = True 

這裏是我的控制器的方法:

@expose() 
@validate(validators=basicQuestionSchema(), error_handler=questionEditError) 
def saveQuestion(self,**kw): 
    type = kw['questionType'] 
    if type == 'selectQuestion': 
     self.save_select_question(**kw) 
    else: 
     self.save_amount_or_yes_no_question(**kw) 


@validate(validators=selectQuestionSchema(),error_handler=questionEditError) 
def save_select_question(self,**kw): 
    ... 
    Do stuff 
    ... 



@validate(validators=amount_or_yes_no_question_Schema(),error_handler=questionEditError) 
def save_amount_or_yes_no_question(self,**kw): 
    ... 
    Do other stuff 
    ... 

我想要做的是驗證兩次,以不同的模式。這是行不通的,因爲只驗證了第一個@validate,另一個不是(可能被忽略)

那麼,我錯了什麼?

感謝您的幫助

回答

1

@validate是請求流的一部分,所以手動調用不執行它的控制器時(它不是一個標準的Python裝飾,所有TG2裝飾實際上只註冊使用tg.hooks這樣的鉤他們必然要求流量)。

您試圖實現的內容應該在驗證階段本身完成,然後您可以在驗證後將save_select_questionsave_amount_or_yes_no_question作爲普通對象方法進行調用。

有關條件驗證的工作示例,請參閱http://runnable.com/VF_2-W1dWt9_fkPr/conditional-validation-in-turbogears-for-python

+0

太好了,謝謝你的工作示例 – 2014-12-01 12:48:55