在z3c.form lis中预选特定复选框

2024-10-03 17:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张z3c表格,登记时用的。其中一个字段是用户可能希望注册的电子邮件列表

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

我希望默认选择其中的第一个,而不应该选择其他的。我在说明书里找不到这样做的方法。有什么想法吗


Tags: z3c用户fromimportzope列表电子邮件schema
1条回答
网友
1楼 · 发布于 2024-10-03 17:22:23

最简单的情况如Modelling using zope.schema, default value section中所述,它z3c.form会选择(relevant documentation)。但是,由于实例是在所有对象之间共享的,因此默认值不应该是可变的,因此为了安全起见,实现了一个defaultFactory参数来处理这个问题。把这些放在一起,你应该有这样的东西:

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'。它被记录在案in the documentation about Vocabularies。如果可读部分是标题,而您希望实际值与标记相同,则需要相应地调整代码。否则,要选择第一个,只需default_email返回[u'System notifications (strongly recommended)']

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

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

或者,如果不希望用默认值或工厂填充接口,可以使用值鉴别器来解决此问题,但这需要花费更多的精力来设置,因此我通常会在足够好的情况下避免处理此问题

相关问题 更多 >