formencode Schema动态添加字段

时间:2011-07-21 09:27:02

标签: python forms formencode

让我们以用户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__,但没有成功...

1 个答案:

答案 0 :(得分: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