2011-06-24 26 views
12

Recientemente comencé a usar señales en mi proyecto Django (v. 1.3) y todas funcionan bien, excepto que No puedo entender por qué la señal m2m_changed nunca se activa en mi modelo. La instancia de la Sección se edita agregando/eliminando instancias en línea de PageChild en un formulario de administrador django.señal Django m2m_changed no activado

He intentado registrar la función de devolución de llamada de cualquier manera como se describe en la documentación, pero no obtengo ningún resultado.

extracto de mi 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) 

Me estoy perdiendo algo obvio?

+2

¿Dónde puedes resolver esto? Buscando la misma respuesta. –

+0

Esto se soluciona ahora (1.6) – nima

+0

A veces, cuando copio y pego código de otro receptor de señal, olvido actualizar el nombre de la función y solo se ejecuta uno de ellos. – freb

Respuesta

0

No estoy seguro de si esto ayudará, pero ¿está seguro de que debería usar Sender.pages.through para este caso especial? quizás si lo intentó @reciever(m2m_changed, sender=PageChild)

Nota: si tiene @reciever, no necesita m2_changed.connect (...) ya que @reciever ya realiza la operación de conexión.

+0

Lo probé con PageChild también, pero no cambié nada. El problema es que ninguna de las dos formas de registrar la devolución de llamada funciona, es por eso que incluí ambas. :/ – user543424

2

No estoy seguro si va a ayudar, pero lo que sigue está trabajando para mí:

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

¡Hola, tu solución también funciona para mí! –

+0

Y no funciona para mí (django 1.5.4) – bux

+0

Este es diferente de lo que el usuario preguntó. A lo que se refería la pregunta original era a un escenario en el que utilizaba un modelo explícito de "PageChild" para especificar la relación aquí. – kingpin

2

Lo está conectando dos veces, una vez con m2m_changed.connect y la otra vez con el receptor decorador.

Cuestiones relacionadas