我正在使用信号在删除对象后执行操作;但是,有时我想根据一个句子执行不同的动作(不是默认动作)。
有没有办法将参数传递给我的信号捕手?或者我是否必须放弃信号,而是硬编码我想在模型中做什么?
我想做的是这样的事情:
>>> 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
关于最佳方法的任何想法?
答案 0 :(得分: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)
...
免责声明:不知道这是否是最佳方法。