[英]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))
我想默認選擇其中的第一個,而其他則不應該。 我看不到規范中執行此操作的方法。 有任何想法嗎?
最簡單的情況如“ 使用zope.schema進行建模”(默認值部分 )中所述, z3c.form
了介紹( 相關文檔 )。 但是,由於實例之間的所有對象都共享默認值,因此默認值不應是可變的,這使情況變得復雜,因此為了安全起見,實現了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'
而不是'offe'
。 有關詞匯的文檔中對此進行了記錄 。 如果人類可讀的部分打算用作標題,並且您希望實際值與令牌相同,則需要相應地調整代碼。 否則,要選擇第一個,只需讓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
另外,如果您不希望為接口填充默認值或工廠,則可以使用值區分符來解決此問題,但這要花費更多的精力來設置,因此通常避免在此情況下處理該問題。夠好了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.