在 z3c.form 列表中预先勾选特定的复选框
Pre-tick specific checkbox in z3c.form list
我有一个 z3c.form 在注册过程中使用。其中一个字段是用户可能希望注册的电子邮件列表。
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))
我希望默认选择其中的第一个,而其他的不应该。我在规范中看不到执行此操作的方法。有什么想法吗?
最简单的情况如 Modelling using zope.schema, default value section, which z3c.form
picks up (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'
是 returned 而不是'offe'
。它被记录在案 in the documentation about Vocabularies。如果人类可读部分旨在成为标题,并且您希望实际值与标记相同,则需要相应地调整代码。否则,对于 select 第一个,您只需 default_email
return [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
或者,如果您不希望使用默认值或工厂填充接口,则可以使用值鉴别器来解决此问题,但设置起来需要付出更多的努力,因此我通常会避免处理当这足够好时。
我有一个 z3c.form 在注册过程中使用。其中一个字段是用户可能希望注册的电子邮件列表。
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))
我希望默认选择其中的第一个,而其他的不应该。我在规范中看不到执行此操作的方法。有什么想法吗?
最简单的情况如 Modelling using zope.schema, default value section, which z3c.form
picks up (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'
是 returned 而不是'offe'
。它被记录在案 in the documentation about Vocabularies。如果人类可读部分旨在成为标题,并且您希望实际值与标记相同,则需要相应地调整代码。否则,对于 select 第一个,您只需 default_email
return [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
或者,如果您不希望使用默认值或工厂填充接口,则可以使用值鉴别器来解决此问题,但设置起来需要付出更多的努力,因此我通常会避免处理当这足够好时。