2013-03-25 77 views
2

在Django商店應用程序中,獲取註冊信號處理程序以執行某項操作,例如將項目添加到購物車。如何覆蓋Django的信號處理程序?

我想用我自己的版本替換這個處理程序localsite/models.py,即。而不觸及原始來源。

如果只是打電話connect方法

signals.satchmo_cart_add_verify.connect(my_veto_out_of_stock) 

的自定義處理程序追加到當前recievers清單和原始仍然得到一個動作:

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 

但發現它醜陋和hackish。

那麼替換信號處理程序的正確方法是什麼?

感謝

+1

我剛找到一種方法。導入原始處理程序函數並將其傳遞給'signals..disconnect',但即使在導入原始函數時,是否還有更通用的方法? – 2013-03-25 15:09:46

+0

好吧,只要輸入鏈接... – okm 2013-03-25 15:11:14

+0

如果你不能導入原始函數(因爲你不知道它在編程時它在哪裏),你可以通過類似'signals.satchmo_cart_add_verify.receivers [0 ] [1]()' – okm 2013-03-25 15:17:19

回答

1

有你試過Signal.disconnect

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

這種方式是明確的國際海事組織。

+0

如果沒有人會抱怨這個解決方案的*清晰度,我會接受這個答案。 – 2013-03-25 19:12:46