コンテナ内のアイテムを削除した後、コンテナの親にリダイレクトしたいと考えています。この目的のために、私は購読しようとしました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
ますが、これにより、予想よりも多くのイベントが発生します。サブスクライブした関数が 2 回呼び出されます。リンクをクリックしたときに 1 回、削除を確認したときにもう一度呼び出されます。さらにややこしいのは、削除をキャンセルした場合にも呼び出されることです。オブジェクトがコンテナーから削除された場合にのみ、イベントが発生することを期待していました。
3つのケースすべてで、イベント オブジェクトは同じで、oldName、oldParent などのプロパティ値も同じです。
アイテムの削除依頼、そのリクエストのキャンセル、および実際のアイテムの削除をどのように区別できますか?
更新:リンクの整合性をチェックするためにオブジェクトがコンテナから削除され、その時点でロールバックがあるため、最初のイベントが呼び出されたようです。