gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:50:01 26 4
gpt4 key购买 nike

我正在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com