2014-10-27 9 views
0

Я использую TurboGears 2,3 и работы по проверке формы с FormEncode и нуждаться в некотором руководствеTurboGears 2,3 @validte в два этапа

У меня есть форма, которая охватывает 2 различных объектов. Они почти то же самое, но с некоторой разницей Когда я представить мою форму, я хочу, чтобы проверить 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 является частью потока запроса, поэтому при вызове контроллера он не выполняется вручную (это не стандартный питон декоратор, все декораторы 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 для рабочего примера условной проверки.

+0

Отлично, и спасибо за рабочий пример –