2

在我的 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(),页面仍将使用其旧位置和新位置进行索引。因此出现上述错误。我怎样才能防止这种情况发生。

4

1 回答 1

2

我认为这是因为您正在尝试移动未完全创建的对象。

您可能想要更改事件处理程序的逻辑或为 IObjectCreatedEvent 注册它,否则您将在一个循环中结束。

每当您将对象添加到容器时都会调用 IObjectAddedEvent,并且在您移动它之后也会发生这种情况。

于 2017-01-05T09:54:56.647 回答