2011-06-24 12 views
12

私は最近Djangoプロジェクト(v。1.3)でシグナルを使用し始めましたが、それ以外は正常に動作します。 m2m_changedシグナルが私のモデルでは決して引き起こされない理由はわかりません。 Sectionインスタンスは、Django管理フォームのPageChildインラインインスタンスを追加/削除することによって編集されます。Djangoシグナルm2m_changedがトリガーされていません

ドキュメントに記載されているようにコールバック関数を登録しようとしましたが、結果が得られませんでした。私の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) 

私は明らかに何かが足りないのですか?

+2

あなたはこれを把握できましたか?同じ答えを探しています。 –

+0

これは修正されました(1.6) – nima

+0

別の信号受信機からコードをコピー&ペーストするときに、関数名を更新するのを忘れて、そのうちの1つだけが実行されることがあります。 – freb

答えて

0

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

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

+0

PageChildでも試してみましたが、何も変更しませんでした。問題は、コールバックを登録する2つの方法のどちらも機能しないことです。そのため、両方を組み込んだのです。 :/ – user543424

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) 
+1

あなたのソリューションは私のためにも機能しますね! –

+0

そして、私のために働かないでください(django 1.5.4) – bux

+0

これはユーザが尋ねたものとは異なります。 元の質問が参照していたのは、明示的なModel "PageChild"を使用してここで関係を指定していたシナリオでした。 – kingpin

2

もう一度m2m_changed.connectと受信機デコレータで2回接続しています。

関連する問題