2011-07-21 3 views
3

のは、見てみましょうフィールドを追加し、例えば、サイト管理者は、要求された電話番号の数を設定し、ユーザーSchemaを動的に

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) 
を:

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

は、どういうわけか私は単純に何ができると思いました

私はFormEncode docsを読んでいるから

バリデータは、インスタンス変数を使用してcustomiza 情報。サブクラス化または通常のインスタンス化のいずれかを使用して、 を設定することができます。

Schema化合物のバリデータとしてドキュメントで呼ばれているので、私はそれが正しいですFancyValidatorのサブクラス推測されます。

しかし、これは機能しません。単に追加されたphone_nは無視され、nameのみが必要です。

更新:

はまた、私は、私は同じ問題を抱えていた...ない成功を収めて尋ねる前に

答えて

5

をオーバーライド__new____classinit__の両方を試してみました、私はここで解決策を見つけた: http://markmail.org/message/m5ckyaml36eg2w3m

すべてのことは、あなたのスキーマの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を呼び出す必要はないとは思わない

+0

はい!ありがとうございました!これはちょうど1時間以上の解決策を探してから私の問題を解決しました。 – Brodan