django - 传递参数 django 信号 - post_save/pre_save

标签 django signals argument-passing

我正在 Django 1.6 中开发一个通知应用程序,我想将其他参数传递给 Django 信号,例如 post_save .我尝试使用 functools 中的部分,但没有运气。

from functools import partial
post_save.connect(
    receiver=partial(notify,
        fragment_name="categories_index"),
            sender=nt.get_model(),
            dispatch_uid=nt.sender
    )
notify函数有一个关键字参数 fragment_name我想在我的信号中作为默认值传递。

有什么建议?

最佳答案

您对部分的尝试不起作用,因为默认情况下这些接收器是使用弱引用连接的。

根据Django docs :

Django stores signal handlers as weak references by default, so if your handler is a local function, it may be garbage collected. To prevent this, pass weak=False when you call the signal’s connect().


from functools import partial
post_save.connect(
    receiver=partial(notify,
        fragment_name="categories_index"),
            sender=nt.get_model(),
            dispatch_uid=nt.sender,
            weak=False
    )

包括 weak=False 并且这部分不会被垃圾收集。

我的原始答案如下,并采用了不使用部分的方法。

您可以在将 post save 函数与 post_save 接收器连接之前对其进行装饰。
from django.dispatch import receiver
from django.db.models.signals import pre_save, post_save, post_delete

def extra_args(fragment_name, *args, **kwargs):
    def inner1(f, *args, **kwargs):
        def inner2(sender, instance, **kwargs):
            f(sender, instance, fragment_name=fragment_name, **kwargs)
        return inner2
    return inner1

@receiver(post_save, sender=ExampleModel)
@extra_args(fragment_name="categories_index")
def my_post_save(sender, instance, fragment_name, **kwargs):
    print "fragment_name : ", fragment_name
    #rest of post save...

extra_args 中的额外内部用于 decorators that take parameters .

如果您想以编程方式执行此操作,其工作方式相同,但请注意,您需要包含 weak=False让包装的函数不被垃圾收集。
receiver(post_save, sender=aSenderClass, weak=False)(extra_args(fragment_name="meep")(my_post_save))

或者没有包装,但是像你最初的尝试一样调用 post_save.connect 部分
post_save.connect(extra_args(fragment_name="meepConnect")(my_post_save), sender=Author, weak=False)

关于django - 传递参数 django 信号 - post_save/pre_save,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22999630/

相关文章:

python - Django South 错误 : AttributeError: 'DateTimeField' object has no attribute 'model' `

python - 特定于队列的 Celery 事件

c - GCC 4.7.0 运行时问题 - 接收信号 11 (SigSegv)

ruby - 为什么单词中的析取和连词需要括号?

java - main(String args[]) 和 main(String[] args) 之间有区别吗?

python - 在模型的 `clean` 方法中引发与字段关联的 ValidationError

database - Google App Engine 数据库值不递增

linux - Shell 脚本使用 Trap 获取 CTRL+Z

objective-c - 为什么信号不会被捕获?

Javascript:将多个参数作为单个变量传递