2015-07-31 3 views
0

У меня есть z3c.form, который используется при регистрации. Одним из полей является список пользователей электронной почты, которые, возможно, пожелают зарегистрироваться.Предупредительный флажок в списке 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)) 

Я бы хотел, чтобы первый из них был выбран по умолчанию, а остальные не должны быть. Я не вижу способа в спецификации, чтобы это сделать. Есть идеи?

ответ

0

Простой корпус такой же, как задокументирован в 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 

В качестве альтернативы, вы можете использовать значение дискриминаторы подойти к этому вопросу, если вы не хотите, чтобы заполнить интерфейс со значением по умолчанию или на заводе для этого, но это намного больше усилий для настройки, поэтому я вообще избегаю иметь дело с этим, когда это достаточно хорошо.

+0

Я должен был отметить это давно. Большое спасибо. – chrism

Смежные вопросы