У меня есть два типа контента Dexterity - участник и критерий - последний из которых используется для определения участия участника в проекте.Критерии хранятся на Участнике как RelationList , однако я хотел бы заменить виджет выбора по умолчанию на основанный на флажках виджет.Я создал собственный виджет, который я назначаю полю критериев, который отображает правильные критерии в виде флажков, но при проверке дает мне следующую ошибку:
2011-11-04 00:27:26 ERROR Zope.SiteErrorLog 1320380846.610.720672558798 http://192.168.2.128:8080/ctcc/Trials/trial1/sites/site1/++add++ctcc.Participant
Traceback (innermost last):
Module ZPublisher.Publish, line 126, in publish
Module ZPublisher.mapply, line 77, in mapply
Module ZPublisher.Publish, line 46, in call_object
Module plone.z3cform.layout, line 70, in __call__
Module plone.z3cform.layout, line 54, in update
Module plone.z3cform.fieldsets.extensible, line 59, in update
Module plone.z3cform.patch, line 30, in GroupForm_update
Module z3c.form.group, line 125, in update
Module z3c.form.form, line 134, in updateWidgets
Module z3c.form.field, line 275, in update
Module z3c.form.browser.checkbox, line 44, in update
Module z3c.form.browser.widget, line 70, in update
Module z3c.form.widget, line 200, in update
Module z3c.form.widget, line 84, in update
Module z3c.form.widget, line 216, in extract
AttributeError: 'list' object has no attribute 'getTermByToken'
Я определил виджет следующим образом:
class ICriteriaListingWidget(Interface):
"""Marker interface for the criteria listing widget"""
class CriteriaSelectionWidget(CheckBoxWidget):
implements(ICriteriaListingWidget)
klass = u'criteria-listing-widget'
input_template = ViewPageTemplateFile('criteria_listing_input.pt')
display_template = ViewPageTemplateFile('criteria_listing_display.pt')
@property
def terms(self):
catalog = getToolByName(self.context, 'portal_catalog')
content = catalog(
portal_type='ctcc.Criterion',
)
return [SimpleTerm(x.id, x, title=x.Title) for x in content]
@adapter(IRelationList, IFormLayer)
@implementer(IFieldWidget)
def CriteriaListingWidget(field, request):
return FieldWidget(field, CriteriaSelectionWidget(request))
Затем для типа Ловкость участника поле будет:
form.widget(criteria=CriteriaListingWidget)
criteria = RelationList(
title = _(u'Inclusion Criteria'),
description = _(u'The participant criteria evaluated against for inclusion'),
value_type = RelationChoice(
source = ObjPathSourceBinder(
object_provides = ICriterion.__identifier__,
),
),
default = [],
required = False,
)
Учитывая характер ошибки, я заменил источник ObjPathSourceBinder наПользовательский словарь для критериев, надеясь, что он вернет объекты с правильным интерфейсом, но я вижу те же ошибки, используя это решение.
ОБНОВЛЕНИЕ: Я обернул список терминов вПростой словарный запас, как и предлагалось, но он просто сдвигает проблему.Обратите внимание, что ошибка теперь возникает в kss_z3cform_inline_validation .
2011-11-06 19:24:36 ERROR Zope.SiteErrorLog 1320625476.430.209960132592 http://192.168.2.128:8080/ctcc/Trials/trial1/sites/site1/kss_z3cform_inline_validation
Traceback (innermost last):
Module ZPublisher.Publish, line 126, in publish
Module ZPublisher.mapply, line 77, in mapply
Module ZPublisher.Publish, line 46, in call_object
Module <wrapper>, line 5, in wrapper
Module kss.core.actionwrapper, line 236, in apply
Module plone.app.z3cform.kss.validation, line 51, in validate_input
Module z3c.form.group, line 92, in extractData
Module z3c.form.form, line 145, in extractData
Module z3c.form.field, line 301, in extract
Module z3c.form.converter, line 311, in toFieldValue
AttributeError: 'SimpleVocabulary' object has no attribute 'getValue'
2011-11-06 19:24:36 ERROR plone.transformchain Unexpected error whilst trying to apply transform chain