TurboGears 2.3 @validte в два шага

Я использую TurboGears 2.3 и работаю над проверкой форм с помощью formencode, и мне нужно некоторое руководство.

У меня есть форма, которая охватывает 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, а другие нет (возможно, игнорируются)

Итак, что я делаю неправильно?

Спасибо за помощь


person A-Palgy    schedule 27.10.2014    source источник


Ответы (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 для рабочего примера условной проверки.

person amol    schedule 09.11.2014