我正在使用TurboGears 2.3并正在使用formencode验证表单并需要一些指导
我有一个涵盖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被验证,而另一个没有(可能被忽略)
那么,我做错了什么?
感谢您的帮助
答案 0 :(得分:1)
@validate
是请求流的一部分,因此当手动调用控制器时它不会执行(它不是标准的python装饰器,所有TG2装饰器实际上只使用tg.hooks
注册一个钩子,所以他们必然要求流动。)
您要尝试实现的目标应该在验证阶段本身完成,然后您可以在验证后调用save_select_question
和save_amount_or_yes_no_question
作为普通对象方法。
有关条件验证的实例,请参阅http://runnable.com/VF_2-W1dWt9_fkPr/conditional-validation-in-turbogears-for-python。