传递pre_delete()或post_delete()信号参数?

3 投票
1 回答
1483 浏览
提问于 2025-04-15 15:29

我正在使用信号来在一个对象被删除后执行某个操作;不过,有时候我想根据一个参数来执行一个不同的操作(而不是默认的操作)。

有没有办法把参数传递给我的信号处理函数?还是说我必须放弃使用信号,而直接在模型里写死我想做的事情?

我想做的事情大概是这样的:

>>> MyModelInstance.delete()
    # default pre_delete() signal is run, in this case, an email is sent
>>> MyModelInstance.delete(send_email=False)
    # same signal is run, however, no email gets sent

有没有什么好的方法可以实现这个?

1 个回答

4

我觉得你不需要在模型里死死地写死你的操作,你还是可以使用信号。不过,你需要重写delete()方法,至少要接受send_email这个参数。而且,因为我觉得你不能在post_delete()里传递额外的参数,所以你需要触发你自己定义的信号。

可以这样做:(我记得的,未经测试!!!

import django.dispatch
your_signal = django.dispatch.Signal(providing_args=["send_email",])

def your_callback(sender, **kwargs):
    print send_email

your_signal.connect(your_callback)

class YourModel(models.Model):
    ...
    def delete(self, send_email=True):
        super(YourModel, self).delete()
        your_signal.send(sender=self, send_email=send_email)
    ...

免责声明:我不知道这是不是最好的方法。

撰写回答