我试图创建一个简单的信号,在Staff
模型的新对象保存在Django-admin中之后打印出一些东西。 MVC python文件位于AppName
。以下是每个文件中的代码:
models.py
from django.db import models
from django.db.models import signals
from django.dispatch import Signal
from django.contrib.auth.models import User
from AppName.signals import printfunction
from django.db.models.signals import post_save
class Staff(User):
class Meta:
proxy = True
app_label = 'auth'
verbose_name_plural = 'Users - Staff'
Signal.connect(printfunction, signal=signals.post_save, sender=Staff)
signals.py
def printfunction(sender, instance, signal, *args, **kwargs):
print ("signal alpha!")
但是它引发了以下异常:
TypeError: connect() got an unexpected keyword argument 'signal'
我按照1.8 django documentation on signals.为什么会出现此错误以及如何解决?
答案 0 :(得分:2)
Signal.connect(receiver[, sender=None, weak=True, dispatch_uid=None])
这是文档的一种非常常见的表示法。它不是可以按原样使用的文字代码。 [
和]
之间的参数是可选的,如果您将它们排除在外,它们将使用默认值。 connect
是类Signal
上的方法。除非另有说明,否则您可以假设它是一个实例方法。您应该拨打Signal.connect()
,而不是字面上调用signal_instance.connect()
,其中signal_instance
当然是Signal
类的实例。
在这种情况下,signals.post_save
是Signal
的实例,它是您要将函数连接到的实例。 receiver
参数是必需的,在这种情况下,它是您的函数printfunction
。 sender
,weak
和dispatch_uid
都是可选的。在您的示例中,您只是将Staff
作为sender
传递,并将其他参数保留为默认值。所以,你的最终函数调用应如下所示:
signals.post_save.connect(printfunction, sender=Staff)
答案 1 :(得分:1)
这是正确的方法:
@receiver(post_save, sender=Staff)
def printfunction(sender, instance, signal, *args, **kwargs):
print ("signal alpha!")