Сигнал Джанго m2m_changed не сработал - PullRequest
12 голосов
/ 24 июня 2011

Я недавно начал использовать сигналы в своем проекте Django (v. 1.3), и все они работают нормально, за исключением того, что я просто не могу понять, почему сигнал m2m_changed никогда не срабатывает на моей модели.Экземпляр Section редактируется путем добавления / удаления встроенных экземпляров 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)

Я что-то упускаю из виду?

Ответы [ 4 ]

11 голосов
/ 19 января 2012

Это открытая ошибка: https://code.djangoproject.com/ticket/16073

Я потратил на это часы на этой неделе.

3 голосов
/ 08 февраля 2013

Вы подключаете его дважды, один раз с m2m_changed.connect, а другой раз с декоратором приемника.

2 голосов
/ 01 сентября 2011

Не уверен, поможет ли это, но у меня работает следующее:

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)
0 голосов
/ 24 июня 2011

Я не уверен, поможет ли это, но вы уверены, что вам следует использовать Sender.pages.through для этого особого случая?возможно, если вы попытались @reciever(m2m_changed, sender=PageChild)

Примечание: если у вас есть @reciever, вам не нужен m2_changed.connect (...), поскольку @reciever уже выполняет операцию подключения.

...