12 Stimmen

Django Signal m2m_changed wird nicht ausgelöst

Ich habe kürzlich angefangen, Signale in meinem Django-Projekt (v. 1.3) zu verwenden und sie funktionieren alle gut, außer dass ich einfach nicht verstehen kann, warum das m2m_changed-Signal nie auf meinem Modell ausgelöst wird. Die Sektionsinstanz wird bearbeitet, indem PageChild Inline-Instanzen auf einem Django-Admin-Formular hinzugefügt/gelöscht werden.

Ich habe versucht, die Rückruffunktion auf die in der Dokumentation beschriebene Weise zu registrieren, aber ohne Ergebnis zu erzielen.

Auszug aus meiner 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 geändert!"

m2m_changed.connect(m2m, sender = Section.pages.through, dispatch_uid = 'foo', weak = False)

Übersehe ich etwas Offensichtliches?

12voto

jblaine Punkte 500

Dies ist ein offener Fehler: https://code.djangoproject.com/ticket/16073

Ich habe diese Woche Stunden damit verschwendet.

3voto

vijay shanker Punkte 2271

Sie verbinden es zweimal, einmal mit m2m_changed.connect und das andere Mal mit dem Empfänger-Dekorateur.

2voto

Stéphane Punkte 1927

Nicht sicher, ob es hilft, aber folgendes funktioniert für mich:

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 erfasst!")

m2m_changed.connect(handle_flow, sender=Flow.datalist.through)

0voto

Thomas Punkte 11298

Ich bin mir nicht sicher, ob das helfen wird, aber bist du sicher, dass du Sender.pages.through für diesen speziellen Fall verwenden solltest? Vielleicht solltest du es mit @reciever(m2m_changed, sender=PageChild) probieren

Hinweis: Wenn du @reciever hast, brauchst du m2_changed.connect(...) nicht, da @reciever bereits die Verbindung durchführt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X