Django信号m2m_changed未触发

时间:2011-06-24 05:40:22

标签: django django-admin signals m2m

我最近开始在我的Django项目中使用信号(v.1.3),除了那些之外它们都工作正常 我只是想不通为什么m2m_changed信号永远不会在我的模型上被触发。通过在django管理表单上添加/删除PageChild内联实例来编辑Section实例。

我尝试按照文档中的描述注册回调函数,但没有得到任何结果。

摘自我的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 个答案:

答案 0 :(得分:11)

这是一个开放的错误:https://code.djangoproject.com/ticket/16073

本周我浪费了几个小时。

答案 1 :(得分:3)

您要连接两次,一次使用m2m_changed.connect,另一次使用接收器装饰器。

答案 2 :(得分:2)

不确定它是否会有所帮助,但以下内容对我有用:

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)

答案 3 :(得分:0)

我不确定这是否会有所帮助,但您确定在这种特殊情况下应该使用Sender.pages.through吗?也许你试过@reciever(m2m_changed, sender=PageChild)

注意:如果您有@reciever,则不需要m2_changed.connect(...),因为@reciever已经执行了连接操作。