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