你使用 partial 尝试可能不起作用,因为这些接收器默认使用弱引用连接。
根据
Django 文档:
Django 默认将信号处理程序存储为弱引用,因此如果您的处理程序是本地函数,则可能被垃圾回收。要防止这种情况,请在调用信号的 connect() 时传递 weak=False。
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,这个 partial 就不会被垃圾回收。
我的原始答案在下面,采用了不使用 partial 的方法。
在连接 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
extra_args 中的额外内部参数是为了 需要带有参数的修饰器。
如果您想以编程方式执行此操作,则可以使用相同的方法,但请注意,您需要包含 weak=False
以使包装函数不被垃圾回收。
receiver(post_save, sender=aSenderClass, weak=False)(extra_args(fragment_name="meep")(my_post_save))
或者不使用包装,而是像您最初尝试的那样使用partial调用post_save.connect
post_save.connect(extra_args(fragment_name="meepConnect")(my_post_save), sender=Author, weak=False)
self.my_extra_param = 'hello world'
。 - Ren