Plone:对删除对象做出反应


问题内容

我想在删除其中的项目后重定向到容器的父级。为此,我尝试了订阅zope.lifecycleevent's IObjectRemovedEvent

@grok.subscribe(ISite, IObjectRemovedEvent)
def redirect_to_trial_on_delete(obj, event):
    request = getattr(obj, 'REQUEST', None)
    if request:
        trial_url = obj.aq_parent.aq_parent.absolute_url()
        request.response.redirect(trial_url)

通过单击触发删除,container/id/delete_confirmation但是这会触发比我预期更多的事件。我已订阅的函数被调用两次:一次是单击链接,然后是确认删除。更令人困惑的是,如果我
取消 删除操作, 也会 调用它。我期待该事件仅被升高 ,如果 一个对象是,你知道, 除去 从容器中。 __

这三种情况下 ,事件对象都是相同的,并且对oldName,oldParent等具有相同的属性值。

如何区分要求删除项目,取消该请求和实际删除项目?

更新: 似乎调用了初始事件是因为从容器中删除了该对象以检查链接的完整性,这时会发生回滚。


问题答案:

一位同事提出了一个可行的解决方案:

import transaction

def redirect_to_trial(trans, obj=None, parent=None):
    if obj.id not in parent:
        request = getattr(obj, 'REQUEST', None)
        if request:
            trial_url = obj.__parent__.__parent__.absolute_url()
            request.response.redirect(trial_url)

@grok.subscribe(ISite, IObjectRemovedEvent)
def on_site_delete(obj, event):
    kwargs = dict(
        obj = obj,
        parent = event.oldParent,
    )
    transaction.get().addAfterCommitHook(redirect_to_trial, kws=kwargs)

在执行重定向之前,此操作将在提交之后进行检查以确保实际上已删除了该对象。

不过,对这是否是一种合适的方法进行一些确认将不胜感激。