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