Skip to main content
 首页 » 编程设计

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

2025年05月04日31cmt

在 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 

但发现它丑陋和骇人听闻。

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

谢谢

请您参考如下方法:

你试过了吗Signal.disconnect ?

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

这种方式在 IMO 中是明确的。