Validation 涡轮齿轮2.3@有效分两步

Validation 涡轮齿轮2.3@有效分两步,validation,turbogears2,formencode,Validation,Turbogears2,Formencode,我正在使用TurboGears 2.3,正在使用formencode验证表单,需要一些指导 我有一个表格,涵盖了两个不同的对象。它们几乎是一样的,但有些不同 当我提交表格时,我想验证两件事 一些基本数据 特定对象的某些特定数据 以下是我的模式: class basicQuestionSchema(Schema): questionType = validators.OneOf(['selectQuestion', 'yesNoQuestion', 'amountQuestion'])

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

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

  • 一些基本数据
  • 特定对象的某些特定数据
  • 以下是我的模式:

    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被验证,而另一个没有(可能被忽略)

    那么,我做错了什么


    感谢您的帮助

    @validate
    是请求流的一部分,因此当手动调用控制器时,它不会被执行(它不是标准的python装饰器,所有TG2装饰器实际上只使用
    tg.hooks
    注册一个钩子,因此它们被绑定到请求流)

    您试图实现的目标应该在验证阶段完成,然后您可以在验证后调用
    保存\选择\问题
    保存\金额\或\是\否\问题
    ,作为普通对象方法

    有关条件验证的工作示例,请参见