我有两种敏捷内容类型 - 参与者和标准 - 后者用于确定项目中的参与者包含。标准作为RelationList存储在 Participant 中,但是我想用基于复选框的选择器小部件替换默认选择器小部件。我创建了一个自定义小部件,我将其分配给条件字段,该字段将正确的条件显示为复选框,但在验证时出现以下错误:
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))
然后在 Participant Dexterity 类型上,该字段为:
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源替换为自定义词汇表作为标准,希望它返回具有正确接口的对象,但使用该解决方案时我看到完全相同的错误。
更新:我已按照建议将术语列表包装在 SimpleVocabulary 中,但这只是将问题转移了。请注意,错误现在发生在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