Plone 与自定义小部件相关的词汇错误

Plone 与自定义小部件相关的词汇错误,plone,widget,dexterity,Plone,Widget,Dexterity,我有两种灵巧性内容类型-参与者和标准-后者用于确定项目中的参与者。标准作为关系列表存储在参与者上,但是我想用基于复选框的小部件替换默认的选择器小部件。我已经创建了一个自定义小部件,分配给criteria字段,该字段将正确的条件显示为复选框,但在验证时会出现以下错误: 2011-11-04 00:27:26 ERROR Zope.SiteErrorLog 1320380846.610.720672558798 http://192.168.2.128:8080/ctcc/Trials/trial1

我有两种灵巧性内容类型-参与者和标准-后者用于确定项目中的参与者。标准作为关系列表存储在参与者上,但是我想用基于复选框的小部件替换默认的选择器小部件。我已经创建了一个自定义小部件,分配给criteria字段,该字段将正确的条件显示为复选框,但在验证时会出现以下错误:

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'
我对小部件的定义如下:

类ICriteriaListingWidget(接口):
“”“标准列表小部件的标记接口”“”
类CriteriaSelectionWidget(CheckBoxWidget):
实现(ICriteriaListingWidget)
klass=u'criteria-listing-widget'
input\u template=ViewPageTemplateFile('criteria\u listing\u input.pt'))
display\u template=ViewPageTemplateFile('criteria\u listing\u display.pt'))
@财产
def术语(自我):
catalog=getToolByName(self.context,“portal\u catalog”)
内容=目录(
portal_type='ctcc.criterial',
)
返回[内容中x的SimpleTerm(x.id,x,title=x.title)]
@适配器(IRelationList,IFormLayer)
@实现者(IFieldWidget)
def CriteriaListingWidget(字段,请求):
返回FieldWidget(字段、CriteriaSelectionWidget(请求))
然后在参与者灵巧度类型上,字段为:

form.widget(标准=CriteriaListingWidget)
标准=关系列表(
标题=u(包括标准),
description=u(评估纳入的参与者标准),
值\类型=关系选择(
source=ObjPathSourceBinder(
对象\u提供=ICriterion.\u标识符\u,
),
),
默认值=[],
必需=错误,
)
考虑到错误的性质,我将ObjPathSourceBinder源代码替换为标准的自定义词汇表,希望它能够返回具有正确接口的对象,但我使用该解决方案看到了完全相同的错误

更新:我已经按照建议将术语列表包装在一个简单的目录中,但它只是解决了问题。请注意,错误现在发生在kss\u z3cform\u inline\u验证中

2011-11-06 19:24:36错误Zope.SiteErrorLog 1320625476.430.209960132592http://192.168.2.128:8080/ctcc/Trials/trial1/sites/site1/kss_z3cform_inline_validation
回溯(最里面的最后一个):
发布中的模块ZPublisher.Publish,第126行
模块ZPublisher.mapply,第77行,在mapply中
模块ZPublisher.Publish,第46行,在call_对象中
包装器中的模块,第5行
模块kss.core.actionwrapper,第236行,在应用中
模块plone.app.z3cform.kss.validation,第51行,验证输入
extractData中模块z3c.form.group第92行
提取数据中模块z3c.form.form第145行
模块z3c.form.field,第301行,摘录
模块z3c.form.converter,第311行,输入toFieldValue
AttributeError:“SimpleVocabulary”对象没有属性“getValue”
2011-11-06 19:24:36错误plone.transformchain尝试应用转换链时出现意外错误

您需要返回词汇表对象,而不是列表:

来自zope.schema.词汇导入SimpleTerm、SimpleVocabulary
# ...
类CriteriaSelectionWidget(CheckBoxWidget):
# ...
@财产
def术语(自我):
catalog=getToolByName(self.context,“portal\u catalog”)
内容=目录(
portal_type='ctcc.criterial',
)
返回SimpleVocabulary([SimpleTerm(x.id,x,title=x.title)表示内容中的x])

SimpleVocabulary
类为这种情况实现了正确的方法。

我不确定这本身是否算是一个答案,但我最终通过创建自定义源和SourceBinder对象避免了对自定义小部件的需要

class CTCCSource(object):
    implements(IVocabularyTokenized)

    container    = None
    content_type = None

    def __init__(self, context):
        self.context = context
        container_path = self._container_path(context)
        self.catalog = getToolByName(context, 'portal_catalog')
        self.intid_utility = getUtility(IIntIds)
        self.content = [i.getObject() for i in self.catalog(portal_type=self.content_type, path={'query': container_path})]

    def _container_path(self, context):
        physical_path = list(context.getPhysicalPath())
        trial_path = physical_path[:physical_path.index('sites')]
        criteria_path = trial_path + [self.container]
        return '/'.join(criteria_path)

    def __contains__(self, term):
        return term in self.content

    def __iter__(self):
        for crit in self.content:
            yield SimpleTerm(crit, self.intid_utility.getId(crit), crit.Title)

    def __len__(self):
        return len(self.content)

    def getTerm(self, obj):
        return SimpleVocabulary.createTerm(
            obj, self.intid_utility.getId(obj), obj.Title()
        )

    def getTermByToken(self, value):
        return self.getTerm(self.intid_utility.getObject(int(value)))

class CTCCSourceBinder(object):
    implements(IContextSourceBinder)
    source = None

    def __init__(self, **kw):
        pass

    def __call__(self, context):
        return self.source(context)

这使我能够从当前上下文中包含的内容生成表单复选框字段,并将对所选选项的引用添加到关联列表中。

我以为我已经尝试过了,但结果相同,但我将在周一上午重试,并在此处更新。谢谢
getTermByToken
由SimpleVocabulary实现;在返回的
列表中找不到该方法,这是一个很大的提示!:-)