в приложении магазина 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
но найти его уродливым и хакерским.
Итак, каков правильный способ замены обработчика сигнала?
Благодаря
Я только что нашел один путь. Импортируя исходную функцию обработчика и передавая ее в 'сигналы..disconnect', но есть ли еще более общий способ, даже если импорт исходной функции невозможен? –
ну, просто набрав ссылку ... – okm
Если вы не можете импортировать оригинальную функцию (потому что вы не знаете, где она находится при программировании?), Вы можете получить функцию приемника с помощью чего-то вроде 'signals.satchmo_cart_add_verify.receivers [0 ] [1]() ' – okm