TypeError:connect()得到了一个意外的关键字参数' signal' - Django信号

时间:2015-07-16 13:27:51

标签: django django-models django-admin 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.为什么会出现此错误以及如何解决?

2 个答案:

答案 0 :(得分:2)

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

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

在这种情况下,signals.post_saveSignal的实例,它是您要将函数连接到的实例。 receiver参数是必需的,在这种情况下,它是您的函数printfunctionsenderweakdispatch_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!")