【问题标题】:TurboGears 2.3 @validte in two stepsTurboGears 2.3 @validte 分两步
【发布时间】:2014-10-27 13:23:40
【问题描述】:

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

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

那么,我做错了什么?

感谢您的帮助

【问题讨论】:

    标签: validation turbogears2 formencode


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多