formencode Schema动态添加字段

发布于 2024-11-25 04:16:33 字数 1222 浏览 2 评论 0原文

让我们以一个用户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__ 在询问之前没有成功......

Let's take, for example, a User Schema where the site admin sets the number of requested phone numbers:

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

Somehow I thought I could simply do:

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)

since I read in FormEncode docs:

Validators use instance variables to store their customization
information. You can use either subclassing or normal instantiation to
set these.

and Schema is called in docs as a Compound Validator and is a subclass of FancyValidator so I guessed it's correct.

But this does not work: simply added phone_n are ignored and only name is required.

Update:

Also I tried both overriding __new__ and __classinit__ before asking with no success...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苍景流年 2024-12-02 04:16:33

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

所有的事情都是使用 schema 的 add_field 方法你是 init 方法,

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

i had the same problem, i found a solution here:
http://markmail.org/message/m5ckyaml36eg2w3m

all the thing is to use the add_field method of schema in youre init method

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

i don't think there's a need to call the parent init

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文