如何覆盖Django的信号处理程序?

时间:2013-03-25 15:00:40

标签: python django satchmo

在Django商店应用程序中,有一个注册信号处理程序来执行某些操作,例如将项目添加到购物车。

我想在localsite/models.py中用我自己的版本替换这个处理程序,即。没有触及原始资源。

如果只是调用connect方法

signals.satchmo_cart_add_verify.connect(my_veto_out_of_stock)

自定义处理程序附加到当前收件人列表,原始仍然会收到操作:

print signals.satchmo_cart_add_verify.receivers
"""
[((140073113515864, 140073319632416), <weakref at 0x7f65502c1aa0;
to 'function' at 0x7f65502c7758 (veto_out_of_stock)>),
((140073114981632, 140073319632416), <weakref at 0x7f65504295d0;
to 'function' at 0x7f655042d500 (my_veto_out_of_stock)>)]
"""

我可以提前删除原始处理程序

for hnd in signals.satchmo_cart_add_verify.receivers:
    del hnd

但发现它丑陋和黑客。

那么更换信号处理程序的正确方法是什么?

由于

1 个答案:

答案 0 :(得分:1)

您是否尝过Signal.disconnect

signals.satchmo_cart_add_verify.disconnect(
    signals.satchmo_cart_add_verify.receivers[0][1]())

这种方式很明确IMO。