在我的 Plone 实例中,我希望每个新创建的页面在创建后都移动到自己的文件夹中。该文件夹应具有与该页面相同的标题和描述。所以我写了这个函数作为 zope.lifecycleevent.interfaces.IObjectAddedEvent 的事件处理程序:
def notifyDocumentIsAdded(document, event):
portal = api.portal.get()
context = aq_inner(document)
folder = aq_parent(context)
if getattr(document,"title") != getattr(folder,"title"):
newfolder = api.content.create(
type='Folder',
title=getattr(document,"title"),
container=folder,
description=getattr(document,"description"))
api.content.move(source=document,target=newfolder,safe_id=True)
这一直有效,直到我想将刚刚添加的新页面移动到新文件夹的最后一行。我明白了
ERROR Products.ZCatalog A different document with value 'c31f15e4923e4f2683dedc829d2f773d' already exists in the index.'
具有该值的 Document 是什么意思?是不是ID冲突?还是移动触发事件的对象有问题?
更新: 使用 python 调试器后,我现在更好地理解了实际问题:尽管我在上面声明,但页面移动正确。问题是:在我的处理程序执行后,页面将被具有过时位置的目录索引,而它被我的处理程序移动。即使在移动后使用 transaction.commit(),页面仍将使用其旧位置和新位置进行索引。因此出现上述错误。我怎样才能防止这种情况发生。