TurboGears 2.3 @validte分两步完成

时间:2014-10-27 13:23:41

标签: validation turbogears2 formencode

我正在使用TurboGears 2.3并正在使用formencode验证表单并需要一些指导

我有一个涵盖2个不同对象的表格。它们几乎相同,但有些不同 当我提交表单时,我想验证两件事

  1. 一些基本数据
  2. 特定对象的一些特定数据
  3. 以下是我的架构:

    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 个答案:

答案 0 :(得分: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