您的位置:

django报错TypeError("Signal receivers must be callable.")怎么办

  发布时间:2023-04-03 22:47:14
报错的原因这个错误是因为在使用Django中的信号时,接收器函数不是可调用的导致的。Django通过信号机制来让应用响应某些特定事件,例如在数据库中保存或删除对象时。或者你也可以用装饰器@receiver来连接信号和接收器这两种方式都是正确的。使用例子是的,下面是一个例子这里我们传入了 my_callback 函数作为接收器,这是一个可调用的对象,因此不会再出现另一种方法就是使用装饰器@receiver来连接信号和接收器这样就可以避免了。

报错的原因

这个错误是因为在使用Django中的信号(signals)时,接收器(receiver)函数不是可调用的导致的。Django通过信号机制来让应用响应某些特定事件,例如在数据库中保存或删除对象时。

为了连接信号和接收器,Django提供了 connect() 函数,你需要传入一个可调用对象作为接收器。所以这个错误通常是由于使用了一个不可调用的对象,例如一个类而不是实例或者函数而导致的。

确保你传入的是一个可调用的对象,例如函数或者方法。

比如:


def my_callback(sender, **kwargs):
    print("Received signal")
    
signals.post_save.connect(my_callback, sender=MyModel)

这里我们传入了 my_callback 函数,这是一个可调用的对象。

或者你也可以用装饰器@receiver来连接信号和接收器


@receiver(post_save, sender=MyModel)
def my_callback(sender, **kwargs):
    print("Received signal")

这两种方式都是正确的。

如何解决

为了解决这个错误,您需要确保传递给 connect() 函数的接收器是一个可调用的对象。可以用函数,类方法或实例方法来作为接收器。

可能的解决方法是:

- 确保传入的对象是一个函数,比如:


def my_callback(sender, **kwargs):
    print("Received signal")
    
signals.post_save.connect(my_callback, sender=MyModel)

- 确保传入的对象是一个类方法,比如:


class MyHandler:
    @staticmethod
    def my_callback(sender, **kwargs):
        print("Received signal")
        
signals.post_save.connect(MyHandler.my_callback, sender=MyModel)

- 确保传入的对象是一个实例方法,比如:


class MyHandler:
    def my_callback(self, sender, **kwargs):
        print("Received signal")

handler = MyHandler()
signals.post_save.connect(handler.my_callback, sender=MyModel)

- 使用 @receiver(signal, sender=model) 装饰器来连接信号和接收器

这些都是可行的解决方案,请根据自己项目的需求和结构来选择。

使用例子

是的,下面是一个例子:


def my_callback(sender, **kwargs):
    print("Received signal")

signals.post_save.connect(my_callback, sender=MyModel)

这里我们传入了 my_callback 函数作为接收器,这是一个可调用的对象,因此不会再出现 TypeError("Signal receivers must be callable.") 。

另一种方法就是使用装饰器@receiver来连接信号和接收器


@receiver(post_save, sender=MyModel)
def my_callback(sender, **kwargs):
    print("Received signal")

这样就可以避免TypeError("Signal receivers must be callable.")了。