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 文档

验证器使用实例变量来存储他们的定制信息。您可以使用子类化或普通实例化来设置这些。

并且Schema在文档中被称为复合验证器,并且是它的子类,FancyValidator所以我猜它是正确的。

但这不起作用:简单地添加phone_n被忽略,只有name是必需的。

更新:

我也尝试过覆盖__new____classinit__在没有成功之前询问...

4

1 回答 1

5

我有同样的问题,我在这里找到了解决方案:http: //markmail.org/message/m5ckyaml36eg2w3m

所有的事情就是在你的init方法中使用 schema 的 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 回答