簡體   English   中英

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

我想默認選擇其中的第一個,而其他則不應該。 我看不到規范中執行此操作的方法。 有任何想法嗎?

最簡單的情況如“ 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM