代码之家  ›  专栏  ›  技术社区  ›  thornomad

传递pre-delete()或post-delete()信号参数?

  •  3
  • thornomad  · 技术社区  · 15 年前

    我正在使用信号在删除对象后执行操作;但是,有时我想执行 不同的 取决于路径的操作(不是默认操作)。

    有没有办法把论点传给我的信号捕捉器?或者我将不得不放弃信号,转而硬编码我想在模型中做的事情?

    我想做的是这样的事情:

    >>> 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 回复  |  直到 15 年前
        1
  •  4
  •   cethegeek    15 年前

    我认为你不需要在模型中硬编码你的行为-你仍然可以使用信号。但您需要重写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)
        ...
    

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