win*_*toy 20 python django django-signals django-models
也许现在已经很晚了,但我无法弄清楚为什么这不起作用.当我有一个post_save信号调用泛型函数时,它可以工作,但是当我有一个post_save信号从模型中调用一个方法时,没有任何反应.这是有效的代码:
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)
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
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)
Run Code Online (Sandbox Code Playgroud)
那里有一个善良的灵魂会阻止我把头砸到墙上吗?谢谢.
K Z*_*K Z 31
在我看来,第二个问题是你使用的是无界方法send_mail.如果你真的想send_mail在课堂上打电话,也许@classmethod或者@staticmethod会帮助你:
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)
Run Code Online (Sandbox Code Playgroud)
要么
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)
Run Code Online (Sandbox Code Playgroud)
或者,不使用这些装饰器,您可以传递有界实例方法:
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)
Run Code Online (Sandbox Code Playgroud)
参考文献:
从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.
Run Code Online (Sandbox Code Playgroud)@classmethod和之间的区别@staticmethod:@staticmethod和@classmethod在Python中有什么区别?