Простой корпус такой же, как задокументирован в 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
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
В качестве альтернативы, вы можете использовать значение дискриминаторы подойти к этому вопросу, если вы не хотите, чтобы заполнить интерфейс со значением по умолчанию или на заводе для этого, но это намного больше усилий для настройки, поэтому я вообще избегаю иметь дело с этим, когда это достаточно хорошо.
Я должен был отметить это давно. Большое спасибо. – chrism