z3c.form динамически добавляет поля в каталог.
Как я могу динамически добавлять поля формы, в зависимости от catalog.results?
Например:
catalog.results = ['Channel A', 'Channel B', 'Channel C',]
form.fields должен быть
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 курсов, для каждого канала должен быть набор полей, а для каждого курса - поле ввода [type=checkbox](или MultiCheckbox)
Извините, я обновил свой вопрос, потому что наш дизайнер отправил неправильное изображение
1 ответ
Я бы не рекомендовал создавать отдельное поле для каждой опции.
Вы можете определить поле списка в вашем z3c.form с помощью CheckBoxFieldWidget
:
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