0

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
    ...

私がやりたかったのは、異なるスキーマで 2 回検証することでした。最初の @validate のみが検証され、他は検証されない (おそらく無視される) ため、これは機能しません。

それで、私は何を間違っていますか?

助けてくれてありがとう

4

1 に答える 1

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を参照してください。

于 2014-11-09T23:21:34.640 に答える