Ответ 1
Это открытая ошибка: https://code.djangoproject.com/ticket/16073
Я потратил несколько часов на это на этой неделе.
Недавно я начал использовать сигналы в своем проекте Django (v. 1.3), и все они отлично работают, за исключением того, что Я просто не могу понять, почему сигнал m2m_changed никогда не срабатывает на моей модели. Экземпляр раздела редактируется добавлением/удалением встроенных экземпляров PageChild в форме администратора django.
Я попытался зарегистрировать функцию обратного вызова в любом случае, как описано в документации, но не получаю никакого результата.
Выдержка из моих models.py
from django.db import models
from django.db.models.signals import m2m_changed
class Section(models.Model):
name = models.CharField(unique = True, max_length = 100)
pages = models.ManyToManyField(Page, through = 'PageChild')
class PageChild(models.Model):
section = models.ForeignKey(Section)
page = models.ForeignKey(Page, limit_choices_to = Q(is_template = False, is_background = False))
@receiver(m2m_changed, sender = Section.pages.through)
def m2m(sender, **kwargs):
print "m2m changed!"
m2m_changed.connect(m2m, sender = Section.pages.through, dispatch_uid = 'foo', weak = False)
Я пропустил что-то очевидное?
Это открытая ошибка: https://code.djangoproject.com/ticket/16073
Я потратил несколько часов на это на этой неделе.
Не уверен, что это поможет, но для меня работает следующее:
class Flow(models.Model):
datalist = models.ManyToManyField(Data)
from django.db.models.signals import post_save, pre_delete, m2m_changed
def handle_flow(sender, instance, *args, **kwargs):
logger.debug("Signal catched !")
m2m_changed.connect(handle_flow, sender=Flow.datalist.through)
Вы подключаете его дважды, один раз с m2m_changed.connect
, а другой - с декодером приемника.
Я не уверен, поможет ли это, но уверены ли вы, что вы должны использовать Sender.pages.through для этого особого случая? возможно, если вы попробовали @reciever(m2m_changed, sender=PageChild)
Примечание. Если у вас есть @reciever, вам не требуется m2_changed.connect(...), поскольку @reciever уже выполняет операцию подключения.