How can I have a Django signal call a model method?
Maybe it's just late, but I cannot figure out why this isn't working. When I have a post_save signal call a generic function, it works, but when I have a post_save signal call a method from a model, nothing happens. Here is code that works:
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)
But this does not work:
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)
Is there a kind soul out there who will keep me from smashing my head into the wall? Thanks.
It seems to me that the problem in the second one is you are using an unbounded method send_mail
. If you really want to call send_mail
from within a class, maybe @classmethod
or @staticmethod
will help you out:
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)
or
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)
Alternatively without using these decorators, you can pass the bounded instance method:
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)
References:
From the Django source code:
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.
Difference between @classmethod
and @staticmethod
: What is the difference between @staticmethod and @classmethod in Python?
上一篇: 从静态方法访问静态变量