TypeError: connect() got an unexpected keyword argument 'signal' - Django signals

TypeError: connect() got an unexpected keyword argument 'signal' - Django signals

我正在尝试创建一个简单的信号,它会在 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. 为什么会出现此错误以及如何解决它?

Signal.connect(receiver[, sender=None, weak=True, dispatch_uid=None])

这是一种非常常见的文档表示法。它不是可以按原样使用的文字代码。 [] 之间的参数是可选的,如果您将它们省略,它们将使用默认值。 connect是classSignal上的一个方法。除非另有说明,否则您可以假定它是一个实例方法。你应该调用 signal_instance.connect() 而不是字面上调用 Signal.connect(),其中 signal_instance 当然是 Signal class.

的一个实例

在这种情况下,signals.post_saveSignal 的一个实例,它是您要将函数连接到的实例。 receiver 参数是必需的,在本例中它是您的函数 printfunctionsenderweakdispatch_uid 都是可选的。在您的示例中,您仅将 Staff 作为 sender 传递,并将其他参数保留为其默认值。因此,您的最终函数调用应如下所示:

signals.post_save.connect(printfunction, sender=Staff)

正确的做法是:

@receiver(post_save, sender=Staff)
def printfunction(sender, instance, signal, *args, **kwargs):
  print ("signal alpha!")