传递pre_delete()或post_delete()信号参数?
我正在使用信号来在一个对象被删除后执行某个操作;不过,有时候我想根据一个参数来执行一个不同的操作(而不是默认的操作)。
有没有办法把参数传递给我的信号处理函数?还是说我必须放弃使用信号,而直接在模型里写死我想做的事情?
我想做的事情大概是这样的:
>>> 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)
...
免责声明:我不知道这是不是最好的方法。