3

Schemaたとえば、サイト管理者が要求された電話番号の数を設定するユーザーを考えてみましょう。

class MySchema(Schema):
    name = validators.String(not_empty=True)
    phone_1 = validators.PhoneNumber(not_empty=True)
    phone_2 = validators.PhoneNumber(not_empty=True)
    phone_3 = validators.PhoneNumber(not_empty=True)
    ...

どういうわけか私は簡単にできると思った:

class MySchema(Schema):
    name = validators.String(not_empty=True)
    def __init__(self, *args, **kwargs):
        requested_phone_numbers = Session.query(...).scalar()
        for n in xrange(requested_phone_numbers):
            key = 'phone_{0}'.format(n)
            kwargs[key] = validators.PhoneNumber(not_empty=True)
        Schema.__init__(self, *args, **kwargs)

FormEncode docsを読んだので:

バリデータは、インスタンス変数を使用してカスタマイズ情報を保存します。これらを設定するには、サブクラス化または通常のインスタンス化を使用できます。

ドキュメントでSchemaは複合バリデーターとして呼び出され、のサブクラスであるFancyValidatorため、正しいと思いました。

しかし、これは機能しません。単純に追加されたphone_nものは無視され、name必要なだけです。

アップデート:

また、私は両方を上書きしようとし__new__まし__classinit__たが、尋ねる前に成功しませんでした...

4

1 に答える 1

5

私は同じ問題を抱えていました。ここで解決策を見つけました: http://markmail.org/message/m5ckyaml36eg2w3m

すべてのことは、あなたのinitメソッドでスキーマのadd_fieldメソッドを使用することです

class MySchema(Schema):
    name = validators.String(not_empty=True)

    def __init__(self, *args, **kwargs):
        requested_phone_numbers = Session.query(...).scalar()
        for n in xrange(requested_phone_numbers):
            key = 'phone_{0}'.format(n)
            self.add_field(key, validators.PhoneNumber(not_empty=True))

親のinitを呼び出す必要はないと思います

于 2012-05-02T09:45:53.930 に答える