z3c.form 动态添加字段 catalog.results.


如何

根据 catalog.results 动态添加表单字段?

例如:

catalog.results = ['Channel A', 'Channel B', 'Channel C',]

表单字段应为

form.fieldset Channels A {
  input[type=checkbox].course a1
  input[type=checkbox].course a2
  input[type=checkbox].course a3
}
form.fieldset Channels B {
  input[type=checkbox].course b1
  input[type=checkbox].course b2
  input[type=checkbox].course b2
}
每个通道

都是文件夹的,每个通道可以包含 N 门课程,每个通道都应该是一个字段集,每个通道都应该是一个输入[类型=复选框](或多复选框) 生成的字段

抱歉,我更新了我的问题,因为我们的设计师发送了错误的图片

我不建议为每个选项创建一个单独的字段。

您可以使用CheckBoxFieldWidget以下内容在 z3c.form 中定义一个列表字段:

from zope import schema
from plone.directives import form
from z3c.form.browser.checkbox import CheckBoxFieldWidget

class IChannels(form.Schema)
    form.widget(channels=CheckBoxFieldWidget)
    channels = schema.List(
        title=_(u'label_channels', default='Channels'),
        value_type=schema.Choice(
            vocabulary=u'channels.vocabulary'),
        required=False)

现在注册一个词汇,名称channels.vocabulary,它根据目录查询返回术语。

from zope.interface import directlyProvides
from zope.schema import vocabulary
from zope.schema.interfaces import IVocabularyFactory

def channels_vocabulary(context):
    catalog = getToolByName(context, 'portal_catalog')
    terms = []
    query = {}  # Your query
    for term in catalog(**query):
        terms.append(vocabulary.SimpleTerm(value=term.decode('utf8'),
                                token=normalizer.normalize(term.decode('utf8')),
                                title=term.decode('utf8')))
    return vocabulary.SimpleVocabulary(terms)
directlyProvides(channels_vocabulary, IVocabularyFactory)

注册 zcml:

<utility
  component=".vocabularies.channels_vocabulary"
  name="channels.vocabulary"
/>

该示例基于 http://docs.plone.org/develop/plone/forms/schemas.html#multi-choice-example

最新更新