12

最近、Django プロジェクト (v. 1.3) でシグナルの使用を開始しましたが、モデルで m2m_changed シグナルがトリガーされない理由を理解できないことを除いて、すべて正常に動作します。Section インスタンスは、django 管理フォームで PageChild インライン インスタンスを追加/削除することで編集されます。

ドキュメントに記載されているように、いずれかの方法でコールバック関数を登録しようとしましたが、結果が得られません。

私の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

4 に答える 4

12

これは未解決のバグです: https://code.djangoproject.com/ticket/16073

今週は何時間も無駄にしました。

于 2012-01-19T18:40:52.900 に答える
3

あなたはそれを2回接続していますm2m_changed.connect.1回はレシーバーデコレータで、もう1回は.

于 2013-02-08T09:07:28.923 に答える
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)
于 2011-09-01T14:27:38.737 に答える
0

これが役立つかどうかはわかりませんが、この特殊なケースではSender.pages.throughを使用する必要がありますか?たぶんあなたが試したなら@reciever(m2m_changed, sender=PageChild)

注:@recieverがある場合、@ recieverはすでに接続操作を実行しているため、m2_changed.connect(...)は必要ありません。

于 2011-06-24T06:24:24.373 に答える