you tag register invalid forget expected endif endblock did python django django-models django-signals

python - tag - ¿Cómo puedo hacer que una señal de Django llame a un método modelo?



invalid block tag on line 14 static expected endblock did you forget to register or load this tag (1)

Tal vez sea solo tarde, pero no puedo entender por qué esto no está funcionando. Cuando tengo una llamada de señal post_save una función genérica, funciona, pero cuando tengo una llamada de señal post_save un método de un modelo, no sucede nada. Aquí está el código que funciona:

class Revision(models.Model): # Model junk... def send_email(sender, instance, created, **kwargs): if created: print "DO STUFF" signals.post_save.connect(send_email, sender=Revision)

Pero esto no funciona:

class Revision(models.Model): # Model junk... def send_email(sender, instance, created, **kwargs): if created: print "DO STUFF" signals.post_save.connect(Revision.send_email, sender=Revision)

¿Hay un alma amable por ahí que me impida golpear mi cabeza contra la pared? Gracias.


Me parece que el problema en la segunda es que está utilizando un método ilimitado send_mail . Si realmente quieres llamar a send_mail desde una clase, tal vez @classmethod o @staticmethod te ayudarán:

class Revision(models.Model): # Model junk... @classmethod def send_email(cls, sender, instance, created, **kwargs): if created: print "DO STUFF" signals.post_save.connect(Revision.send_email, sender=Revision)

o

class Revision(models.Model): # Model junk... @staticmethod def send_email(sender, instance, created, **kwargs): if created: print "DO STUFF" signals.post_save.connect(Revision.send_email, sender=Revision)

Alternativamente, sin usar estos decoradores, puede pasar el método de instancia acotada:

class Revision(models.Model): # Model junk... def send_email(self, sender, instance, created, **kwargs): if created: print "DO STUFF" signals.post_save.connect(Revision().send_email, sender=Revision)

Referencias:

  1. Desde el código fuente de Django:

    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None): """ Connect receiver to sender for signal. Arguments: receiver A function or an instance method which is to receive signals. Receivers must be hashable objects. If weak is True, then receiver must be weak-referencable (more precisely saferef.safeRef() must be able to create a reference to the receiver). Receivers must be able to accept keyword arguments. If receivers have a dispatch_uid attribute, the receiver will not be added if another receiver already exists with that dispatch_uid.

  2. Diferencia entre @classmethod y @staticmethod : ¿Cuál es la diferencia entre @staticmethod y @classmethod en Python?