Python Web开发:信号触发器
来自CloudWiki
背景
介绍如何利用Django信号机制实现触发效果:
当招聘人员修改简历的status字段时(未审/通过/未通过)时触发额外操作,
灵活使用django内置的模型信号 就可以监控大部分模型对象的变化,并且不需要修改原模型的代码。
代码
编辑models.py文件,添加代码:
@receiver(post_init, sender=Resume) def before_save_resume(sender, instance, **kwargs): instance.__original_status = instance.status @receiver(post_save, sender=Resume) def post_save_resume(sender, instance, **kwargs): print(instance.__original_status) print(instance.status)
- 引入自带的模型信号post_init和post_save,post_init表示在管理员单击“保存”按钮前触发信号,post_save表示在单击保存按钮后触发信号)
- 信号的接收采用装饰器@receiver来实现,第一个参数表示信号类型,第二个是需要监控的模型类。
- 对于两个不同的信号,分别采用两个不同的函数来相应,第一个函数 用于保存初始值,第二个函数用于打印前后两个值,说明管理员对status状态的更改可以有效的监控到。
效果图
后台打印:
[28/May/2021 23:44:12] "GET /admin/contactApp/resume/2/change/ HTTP/1.1" 200 11133 [28/May/2021 23:45:04] "GET /admin/jsi18n/ HTTP/1.1" 200 7722 2 1