Django 信号使用问题:
在使用django内置信号修改新注册的用户密码的时候,发现内置信号没有被触发。百度&官方文档找到了答案
1.信号的函数应该放在哪里?
这段代码应该放在哪里?
严格来说,信号处理和注册的代码应该放在你想要的任何地方,但是推荐避免放在应用的根模块和
models
模块中,以尽量减少产生导入代码的副作用。实际上,信号处理函数通常定义在应用相关的
signals
子模块中。 信号receiver在你应用配置类中的ready()
方法中连接。 如果你使用receiver()
装饰器,只需要在ready()
内部导入signals
子模块就可以。注
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,这样才能触发信号 ... ]