【问题标题】:TypeError: connect() got an unexpected keyword argument 'signal' - Django signalsTypeError: connect() got an unexpected keyword argument 'signal' - Django 信号
【发布时间】:2015-10-05 23:30:51
【问题描述】:

我正在尝试创建一个简单的信号,该信号在 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])
  • 是的,逗号和“[”在我尝试时出错,所以我恢复到调度程序的 Signal 语法
  • 现在可以工作了吗/?
  • 好的,如果信号不应该在那里,我在哪里定义 post_save 操作?
  • 您期望 print 语句的输出在哪里?你确定你有一个 Staff 实例,而不是例如User 实例?

标签: django django-models django-admin django-signals


【解决方案1】:
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)

【讨论】:

    【解决方案2】:

    这是正确的做法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2015-09-23
      相关资源
      最近更新 更多