2011-06-24 22 views
12

Niedawno zacząłem używać sygnałów w moim projekcie Django (w. 1.3) i wszystkie działają dobrze, z wyjątkiem tego, że Po prostu nie mogę zrozumieć, dlaczego sygnał m2m_changed nigdy nie zostanie wyzwolony w moim modelu. Instancja sekcji jest edytowana przez dodanie/usunięcie instancji wbudowanych PageChild w formularzu administratora django.Sygnał Django m2m_changed nie został uruchomiony

Próbowałem zarejestrować funkcję zwrotną w sposób opisany w dokumentacji, ale nie otrzymuję żadnych wyników.

Fragment mojego 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) 

jestem brakuje czegoś oczywiste?

+2

Gdzie możesz to zrozumieć? Poszukuję tej samej odpowiedzi. –

+0

Naprawiono to teraz (1.6) – nima

+0

Czasami, gdy kopiuję i wklejaję kod z innego odbiornika sygnału, zapominam o aktualizacji nazwy funkcji i tylko jeden z nich działa. – freb

Odpowiedz

0
Nie jestem pewien, czy to pomoże, ale czy jesteś pewien, że powinieneś użyć Sender.pages.through w tym specjalnym przypadku? być może, jeśli wypróbowałeś @reciever(m2m_changed, sender=PageChild)

Uwaga: jeśli masz @reciever, nie potrzebujesz m2_changed.connect (...), ponieważ @rever już wykonuje operację łączenia.

+0

Próbowałem również z PageChild, ale niczego nie zmieniłem. Problem polega na tym, że żaden z dwóch sposobów rejestracji wywołania zwrotnego nie działa, dlatego uwzględniłem oba. :/ – user543424

2

Nie wiem, czy to pomoże, ale następujący pracuje dla mnie:

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

hej człowiek Twoje rozwiązanie działa również dla mnie! –

+0

I nie działa dla mnie (django 1.5.4) – bux

+0

Ten różni się od tego, o co prosił użytkownik. To, do czego odnosiło się pierwotne pytanie, to scenariusz, w którym używał jawnego modelu "PageChild" do określenia relacji tutaj. – kingpin

2

Podłączasz go dwukrotnie, raz z m2m_changed.connect, a drugi z dekoratorem odbiornika.

Powiązane problemy