Django如何在类上而不是在函数上使用“receiver”修饰符

2024-10-08 18:30:20 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Django signalsreceiverdecorator我有以下函数。在

@receiver(post_save)
def action_signal(sender, instance, created, **kwargs):
    pass

是否可以在类上使用receiver修饰符而不是函数?原因是我想要一个__init__方法等

也就是说,我怎样才能让这样的东西发挥作用。。。在

^{pr2}$

Tags: djangoinstance函数signalsavedefactionpass
2条回答

在类方法上使用receiver修饰符没有实际意义。您希望在什么时候实例化对象并运行__init__方法?在

您可以对connecting signals使用手动方法,而不是使用receiver修饰符。在

首先实例化对象:

action_signal = ActionSignals()

然后可以使用connect方法连接信号:

^{pr2}$

添加基于类的信号处理程序

您可以这样做:

class ActionSignals(object):
    def __init__(self, *args, **kwargs):
        # ...            

    def __call__(self, *args, **kwargs):
        print(self.stuff)

然后连接信号处理器:

^{pr2}$

这使用了python的“magic”^{}方法,该方法允许您将类的实例用作函数。在

避免重复

注意在代码中添加处理程序的位置,因为可能会创建重复项。例如,如果您要将第二位代码放在模块根目录中,它将在每次导入模块时添加一个处理程序。在

要避免这种情况,可以执行following

post_save.connect(handler, dispatch_uid="my_unique_identifier")

正如@Alasdair所指出的,您可以在AppConfig.ready()中添加处理程序(这是推荐的执行位置),不过,如果您注意不要创建不希望的重复项,则通常可以在任何位置执行此操作。在

"Where should this code live?" in this doc。在

相关问题 更多 >

    热门问题