2013-03-25 7 views
2

в приложении магазина Django появляется зарегистрированный обработчик сигнала для какого-либо действия, например, добавление элемента в корзину.Как переопределить обработчик сигналов 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

Я только что нашел один путь. Импортируя исходную функцию обработчика и передавая ее в 'сигналы..disconnect', но есть ли еще более общий способ, даже если импорт исходной функции невозможен? –

+0

ну, просто набрав ссылку ... – okm

+0

Если вы не можете импортировать оригинальную функцию (потому что вы не знаете, где она находится при программировании?), Вы можете получить функцию приемника с помощью чего-то вроде 'signals.satchmo_cart_add_verify.receivers [0 ] [1]() ' – okm

ответ

1

ли ваш пытались Signal.disconnect?

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

Этот путь ясен ИМО.

+0

Если никто не будет жаловаться на * ясность * этого решения, я собираюсь принять этот ответ. –

Смежные вопросы