2011-06-24 2 views
12

J'ai récemment commencé à utiliser des signaux dans mon projet Django (v. 1.3) et ils fonctionnent tous bien sauf que Je n'arrive pas à comprendre pourquoi le signal m2m_changed n'est jamais déclenché sur mon modèle. L'instance de Section est éditée en ajoutant/supprimant des instances de PageChild inline sur un formulaire d'administration django.Django signal m2m_changed pas déclenché

J'ai essayé d'enregistrer la fonction de rappel dans l'une ou l'autre des directions décrites dans la documentation, mais je n'obtiens aucun résultat.

Extrait de mon 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) 

Suis-je manque quelque chose d'évident?

+2

Où est-ce que vous savez? Vous cherchez la même réponse. –

+0

Ceci est maintenant corrigé (1.6) – nima

+0

Parfois, lorsque je copie et collez du code à partir d'un autre récepteur de signaux, j'oublie de mettre à jour le nom de la fonction et un seul d'entre eux s'exécute. – freb

Répondre

0

Je ne suis pas sûr si cela aidera, mais êtes-vous sûr que vous devriez utiliser Sender.pages.through pour ce cas particulier? si vous avez essayé @reciever(m2m_changed, sender=PageChild)

Remarque: Si vous avez @reciever, vous n'avez pas besoin de m2_changed.connect (...) car @reciever effectue déjà l'opération de connexion.

+0

Je l'ai aussi essayé avec PageChild, mais je n'ai rien changé. Le problème est que ni l'une ni l'autre de deux manières d'enregistrer le callback ne fonctionne, c'est pourquoi j'ai inclus les deux. :/ – user543424

2

Je ne sais pas si cela va aider, mais ce qui suit travaille pour moi:

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

hey man votre solution fonctionne pour moi aussi! –

+0

Et ne fonctionne pas pour moi (django 1.5.4) – bux

+0

Celui-ci est différent de ce que l'utilisateur a demandé. Ce à quoi la question originale faisait référence était un scénario où il utilisait un modèle explicite "PageChild" pour spécifier la relation ici. – kingpin

2

Vous le connectez deux fois, une fois avec m2m_changed.connect et l'autre fois avec le récepteur décorateur.

Questions connexes