Django 信号使用问题

Django 信号使用问题:

在使用django内置信号修改新注册的用户密码的时候,发现内置信号没有被触发。百度&官方文档找到了答案

1.信号的函数应该放在哪里?

这段代码应该放在哪里?

严格来说,信号处理和注册的代码应该放在你想要的任何地方,但是推荐避免放在应用的根模块和models模块中,以尽量减少产生导入代码的副作用。

实际上,信号处理函数通常定义在应用相关的signals子模块中。 信号receiver在你应用配置类中的ready()方法中连接。 如果你使用receiver()装饰器,只需要在ready()内部导入signals子模块就可以。

ready()方法会在测试期间执行多次,所以你可能想要保证信号不会重复,尤其是打算在测试中发送它们的情况。

2.为什么没有触发?

信号触发主要需要三个条件:

1.信号能正常工作

2.在app的config中触发信号

3.在settings中使用自定义的AppConfig

  • 编写signals

    代码如下signals.py,django对于信号推荐位置的是:app所在目录下新建名为signals.py的文件

from django.db.models.signals import post_delete
from django.dispatch import receiver
from device.models import Device  # replace with your Model 

@receiver(post_delete, sender=Device, weak=False)
def delete_comment_after(sender):
    print('device delete')
    print(sender)
  • 编写 AppConfig,位于 app下 apps.py,代码如下:
from django.apps import AppConfig

class DeviceConfig(AppConfig):
    name = 'device'
    verbose_name = '设备'

def ready(self):
    import device.signals
  • 在settings.py中修改INSTALL_APPS代码如下:

    INSTALLED_APPS = [
        ...
        'device' ---> 'device.apps.DeviceConfig'
            'device.apps.DeviceConfig', 
        默认情况下我们通常叫做device,但是因为信号需要在自定义的AppConfig中触发,因此必须把
        device修改为 device.apps.DeviceConfig,这样才能触发信号
             ...
    ]
    
    
原文地址:https://www.cnblogs.com/wenqiangit/p/10905926.html