Plone 平铺编辑视图词汇表的上下文错误

Plone 平铺编辑视图词汇表的上下文错误,plone,Plone,我有一个具有选项字段的永久磁贴: subjects = schema.List( title=_(u"Subjects"), value_type=schema.Choice( vocabulary='my.subjects' ), ) 但这在编辑视图渲染时失败,如下所示: 2013-05-22 18:37:56 ERROR Zope.SiteErrorLog 1369240676.330.546121806344 http://localhost:80

我有一个具有选项字段的永久磁贴:

subjects = schema.List(
    title=_(u"Subjects"),
    value_type=schema.Choice(
        vocabulary='my.subjects'
    ),
)
但这在编辑视图渲染时失败,如下所示:

2013-05-22 18:37:56 ERROR Zope.SiteErrorLog 1369240676.330.546121806344 http://localhost:8082/plumi/@@edit-tile/tagcloud.tile/home-cloud
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.app.tiles.browser.edit, line 48, in update
  Module plone.app.tiles.browser.base, line 55, 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 plone.app.tiles.browser.base, line 71, in updateWidgets
  Module z3c.form.field, line 275, in update
  Module z3c.form.browser.orderedselect, line 50, in update
  Module z3c.form.browser.widget, line 70, in update
  Module z3c.form.widget, line 199, in update
  Module z3c.form.widget, line 193, in updateTerms
  Module zope.component._api, line 107, in getMultiAdapter
  Module zope.component._api, line 120, in queryMultiAdapter
  Module zope.component.registry, line 238, in queryMultiAdapter
  Module zope.interface.adapter, line 532, in queryMultiAdapter
  Module z3c.form.term, line 174, in CollectionTerms
  Module zope.schema._field, line 352, in bind
  Module Zope2.App.schema, line 33, in get
  Module my.vocabularies, line 22, in __call__
  Module Products.CMFCore.utils, line 10, in check_getToolByName
  Module Products.CMFCore.utils, line 120, in getToolByName
  AttributeError: portal_catalog
这是因为传递给词汇表调用的
上下文是互动程序的数据字典。在另一个字段中使用
SearchableTextSourceBinder
时也会发生这种情况:


source=SearchableTextSourceBinder(
{'is_folderish':True},
默认\u query='path:'
)
这使得plone.app.vocabularies.catalog失败:

Module plone.app.vocabularies.catalog, line 237, in __call__
  Module plone.app.vocabularies.catalog, line 144, in __init__
  Module Products.CMFCore.utils, line 10, in check_getToolByName
  Module Products.CMFCore.utils, line 120, in getToolByName
AttributeError: portal_catalog

我不知道这是否是出于设计,但是当编辑一个持久化的tile时,上下文相关词汇表将在没有任何获取包装的情况下获取其上下文(持久化的tile数据字典)。因此,所有依赖于获取的查找都将失败

您可以尝试使用
plone.api.portal.get()
zope.component.hooks.getSite()
修复词汇表,将portal root用作
getToolByName
-looksup的上下文


如果您真的需要当前上下文,一种不好的方法是获取
zope.globalrequest.getRequest().get(“PUBLISHED”)
,它应该是ZPublisher找到的当前可发布上下文。它通常是一个视图,但您可以从其获取链中获取上下文对象。当然,您应该非常谨慎地使用这种方法。

我不知道,这是否是出于设计,但当编辑一个持久化磁贴时,上下文相关词汇表将获得其上下文(持久化磁贴数据字典),而无需任何采集包装。因此,所有依赖于获取的查找都将失败

您可以尝试使用
plone.api.portal.get()
zope.component.hooks.getSite()
修复词汇表,将portal root用作
getToolByName
-looksup的上下文


如果您真的需要当前上下文,一种不好的方法是获取
zope.globalrequest.getRequest().get(“PUBLISHED”)
,它应该是ZPublisher找到的当前可发布上下文。它通常是一个视图,但您可以从其获取链中获取上下文对象。当然,你应该对这种方法很有防御性。

事实上,问题并不是我错过了获取工具的上下文:)我可以在我的词汇表中解决这个问题,我们可以解决p.a.词汇表。正如你所说,问题在于“上下文敏感词汇”。现在的问题是:我们不应该在p.a.tiles(或任何地方)中解决这个问题吗?如果您有时间,您可以尝试实现一个自定义TileDataManager(适配器),它将1)在获取数据时返回采集包装的dict-like对象,2)在保存数据时剥离采集包装。因为它是适配器,所以您可以根据自定义浏览器层注册它,而不需要覆盖。对于TileDataManager,请参阅:一个变化是,如果包装器不适应为dict注册的dm适配器,那么DataManager在z3c.from中的查找将失败。实际上,问题不是我错过了获取工具的上下文:)我可以在我的词汇表中修复它,我们可以修复p.A.词汇表。正如你所说,问题在于“上下文敏感词汇”。现在的问题是:我们不应该在p.a.tiles(或任何地方)中解决这个问题吗?如果您有时间,您可以尝试实现一个自定义TileDataManager(适配器),它将1)在获取数据时返回采集包装的dict-like对象,2)在保存数据时剥离采集包装。因为它是适配器,所以您可以根据自定义浏览器层注册它,而不需要覆盖。对于TileDataManager,请参阅:一个变化是,如果包装器不适应为dict注册的dm适配器,那么DataManager在z3c.from中的查找将失败。