有很多帮助(我是一个没有经验的程序员/ Plone开发人员)我在一个新的Plone网站上创建了一些自定义内容类型。我现在遇到错误。内容类型称为“组织”,它有一个可选的多值引用字段,其中包含“允许类型”的“网站”(另一种自定义内容类型)。我创建了很多组织条目;一切都很好。然后我将其中一些链接到网站。他们保存好了,但现在,一两周后,当我尝试查看其中任何一个时,我收到此错误消息:
追溯(最里面的):
Module ZPublisher.Publish, line 127, in publish
Module ZPublisher.mapply, line 77, in mapply
Module ZPublisher.Publish, line 47, in call_object
Module Products.Five.browser.metaconfigure, line 477, in __call__
Module Products.Five.browser.pagetemplatefile, line 126, in __call__
Module Products.Five.browser.pagetemplatefile, line 60, in __call__
Module zope.pagetemplate.pagetemplate, line 113, in pt_render
Module zope.tal.talinterpreter, line 271, in __call__
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 888, in do_useMacro
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 533, in do_optTag_tal
Module zope.tal.talinterpreter, line 518, in do_optTag
Module zope.tal.talinterpreter, line 513, in no_tag
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 954, in do_defineSlot
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 533, in do_optTag_tal
Module zope.tal.talinterpreter, line 518, in do_optTag
Module zope.tal.talinterpreter, line 513, in no_tag
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 858, in do_defineMacro
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 954, in do_defineSlot
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 533, in do_optTag_tal
Module zope.tal.talinterpreter, line 518, in do_optTag
Module zope.tal.talinterpreter, line 513, in no_tag
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 946, in do_defineSlot
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 533, in do_optTag_tal
Module zope.tal.talinterpreter, line 518, in do_optTag
Module zope.tal.talinterpreter, line 513, in no_tag
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 858, in do_defineMacro
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 533, in do_optTag_tal
Module zope.tal.talinterpreter, line 518, in do_optTag
Module zope.tal.talinterpreter, line 513, in no_tag
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 888, in do_useMacro
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 533, in do_optTag_tal
Module zope.tal.talinterpreter, line 518, in do_optTag
Module zope.tal.talinterpreter, line 513, in no_tag
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 852, in do_condition
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 533, in do_optTag_tal
Module zope.tal.talinterpreter, line 518, in do_optTag
Module zope.tal.talinterpreter, line 513, in no_tag
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 852, in do_condition
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 821, in do_loop_tal
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 533, in do_optTag_tal
Module zope.tal.talinterpreter, line 518, in do_optTag
Module zope.tal.talinterpreter, line 513, in no_tag
Module zope.tal.talinterpreter, line 343, in interpret
Module zope.tal.talinterpreter, line 583, in do_setLocal_tal
Module zope.tales.tales, line 696, in evaluate
URL: file:/usr/local/Plone/buildout-cache/eggs/archetypes.referencebrowserwidget-2.1-py2.6.egg/archetypes/referencebrowserwidget/skins/referencebrowser/referencebrowser.pt
Line 57, Column 12
Expression: <PythonExpr '/'.join(obj.getPhysicalPath())>
Names:
{'args': (),
'container': <Organisation at /ecn/what-we-do/about/sponsors/ccw>,
'context': <Organisation at /ecn/what-we-do/about/sponsors/ccw>,
'default': <object object at 0xb75f86d0>,
'here': <Organisation at /ecn/what-we-do/about/sponsors/ccw>,
'loop': {},
'nothing': None,
'options': {},
'repeat': <Products.PageTemplates.Expressions.SafeMapping object at 0xcadb89c>,
'request': <HTTPRequest, URL=http://la-ecnweb1.nerc-lancaster.ac.uk:8080/ecn/what-we-do/about/sponsors/ccw/organisation_view>,
'root': <Application at >,
'template': <Products.Five.browser.pagetemplatefile.ViewPageTemplateFile object at 0xaa4154c>,
'traverse_subpath': [],
'user': <PropertiedUser 'admin'>,
'view': <Products.Five.metaclass.SimpleViewClass from /usr/local/Plone/zinstance/src/ceh.ecn_theme/ceh/ecn_theme/browser/templates/organisation_view.pt object at 0xc926aec>,
'views': <Products.Five.browser.pagetemplatefile.ViewMapper object at 0xc926aac>}
Module Products.PageTemplates.ZRPythonExpr, line 49, in __call__
__traceback_info__: '/'.join(obj.getPhysicalPath())
Module PythonExpr, line 1, in <expression>
AttributeError:'NoneType'对象没有属性'getPhysicalPath'
未参考网站的“组织”显示正常。任何人都可以提出可能存在的问题吗?我想知道这是否是一个索引问题,所以尝试更新portal_catalog,reference_catalog和uid_catalog,但这没有帮助。
奇怪的是,我创建了一个新的“组织”并将其链接到“网站”,它运行正常。此外,我在笔记本电脑上的Plone本地实例上测试了我的所有自定义类型和模板,这一切都很好。这就好像某些东西自首次创建以来已经破坏了这些特定对象。
请告知您是否需要我发布任何代码,我会这样做。
感谢。
答案 0 :(得分:3)
如果您以某种方式移动了组织,绕过了用于更新引用的机器,或者如果该机制被某种方式破坏了,那么这就解释了这些问题。我认为清除reference_catalog和uid_catalog后跟portal_catalog的“清除和重建”可能会解决您的问题。您将在“更新目录”下方找到该按钮,该按钮位于portal_catalog的ZMI中同一页面的中间。 “更新目录”过程假定目录已经正确地知道要编入索引的所有对象的位置,但这正是这里的问题,一个或多个目录没有及时更新“站点”的位置。这就是“Clear and Rebuild”的用武之地。来自ZMI页面上的文档:
Clear and Rebuild will remove all entries from the catalog, and then walk the entire portal looking for content objects which should be indexed in the catalog and index them. Doing this will remove inappropriate entries from the portal catalog (scripts, templates) and preserve all indexed content. This may take a long time, but it is the correct way to rebuild a catalog that has had objects improperly added or removed.
如果这不起作用,或者您只是好奇,那么您必须找出导致问题的参考。查找带有错误的“组织”示例,使用类似“bin / instance debug”的内容启动调试器,然后执行以下操作:
>>> portal = app.unrestrictedTraverse('/portal_name')
>>> org = portal.unrestrictedTraverse('path/to/buggy/organization') # no leading slash
>>> broken = [item for item in org.getReferenceImpl(field_relationship) if item.getTargetObject() is None]
>>> brains = portal.uid_catalog.unrestrictedSearchResults(UID=[item.targetUID for item in broken])
>>> from pprint import pprint
>>> pprint([brain.getPath() for brain in brains])
这应该打印出目录所涉及的目录认为的路径列表。您可以检查并查看更多正在发生的事情。你还可以更多地了解“破碎”和“大脑”列表中的内容,以了解更多正在发生的事情。
答案 1 :(得分:1)
似乎引用的对象不再存在了。它无法通过UUID查找,因此返回reference_catalog中的某个无(_objectByUUID)。
我认为archetypes.referencebrowserwidget应该处理这种情况,但事实并非如此。
您还记得您引用的网站吗?它还在吗? 你能以某种方式删除引用并重新创建它吗?
干杯
答案 2 :(得分:0)
有类似的问题:当引用的页面被取消时,似乎某些东西在“引用系统”中不起作用。该页面标记为未公开
覆盖referencebrowser.pt更改行从164到172解决了我的问题
在archetypes / referencebrowserwidget / skins / referencebrowser / referencebrowser.pt
<label tal:define="title set/title_or_id | string:Undisclosed;
obj_path python: set and '/'.join(set.getPhysicalPath()) or None;">
<input type="checkbox"
tal:attributes="name string:${fieldName}:list;
value python:helper.getUidFromReference(set);
checked python: set and 'checked' or None;
style python: not set and 'display:none' or None;"
checked="checked" />