首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >z3c.form列表中的预勾选复选框

z3c.form列表中的预勾选复选框
EN

Stack Overflow用户
提问于 2015-07-31 09:06:29
回答 1查看 46关注 0票数 0

我有一个在注册过程中使用的z3c.form。其中一个字段是用户可能希望注册的电子邮件列表。

代码语言:javascript
复制
from zope import schema
from zope.schema.vocabulary import SimpleVocabulary

emailVocab = SimpleVocabulary.fromItems((
    ('sysn', u'System notifications (strongly recommended)'),
    ('mark', u'Marketing emails'),
    ('offe', u'Special offers')))

...

email_optin = schema.List(
    title = u'',
    description = u'',
    required = False,
    value_type = schema.Choice(source=emailVocab))

我希望在默认情况下选择其中的第一个,而其他的则不应该选择。我看不出有什么办法能做到这一点。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-18 03:54:02

最简单的情况如使用zope.schema进行建模,默认值部分中所记录的,z3c.form拾取(相关文件)。但是,由于缺省值不应该是可变的,因为实例在所有方面都是共享的,所以为了安全起见,为了安全起见,实现了一个defaultFactory参数来处理这个问题,这使得这个问题变得复杂起来。把所有这些加在一起,你就应该有这样的东西:

代码语言:javascript
复制
import zope.schema
import zope.interface
from zope.schema.vocabulary import SimpleVocabulary

emailVocab = SimpleVocabulary.fromItems((
    ('sysn', u'System notifications (strongly recommended)'),
    ('mark', u'Marketing emails'),
    ('offe', u'Special offers')))

def default_email():
    return [u'Special offers']  # example


class IEmailPreference(zope.interface.Interface):

    # ...

    email_optin = zope.schema.List(
        title=u'',
        description=u'',
        required=False,
        value_type=zope.schema.Choice(source=emailVocab),
        defaultFactory=default_email,
    )

请注意,用于默认值的实际值不是token部件,而是value部件,因此返回字符串'Special offers'而不是'offe'。这是记录在案的在有关词汇表的文档中。如果人类可读的部分打算作为标题,并且希望实际值与令牌相同,则需要相应地调整代码。否则,要选择第一个,只需使用default_email返回[u'System notifications (strongly recommended)']

为了完整起见,您的表单模块可能如下所示:

代码语言:javascript
复制
from z3c.form.browser.checkbox import CheckBoxFieldWidget
from z3c.form.form import Form

class EmailPreferenceForm(Form):

    fields = z3c.form.field.Fields(IEmailPreference)
    fields['email_optin'].widgetFactory = CheckBoxFieldWidget

或者,如果您不希望使用默认值或工厂填充接口,则可以使用值鉴别器来处理此问题,但是这需要做更多的工作,所以我通常避免在足够好的情况下处理这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31742274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档