我想在删除容器中的项目后重定向到容器的父级。为此,我尝试订阅 zope.lifecycleevent 的 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)
这会在提交之后进行检查,以确保对象在执行重定向之前确实已被删除。
不过,如果能确认这是否是一种合适的方法,我们将不胜感激。
关于python - Plone:对对象移除使用react,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11218272/