传递参数django signals - post_save / pre_save [英] Passing arguments django signals - post_save/pre_save

查看:354
本文介绍了传递参数django signals - post_save / pre_save的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在Django 1.6中发布通知应用程序,我想传递其他参数给Django信号,例如 post_save 。我试图使用部分功能,但没有运气。

I am working on a notification app in Django 1.6 and I want to pass additional arguments to Django signals such as post_save. I tried to use partial from functools but no luck.

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

通知函数有一个关键字参数 fragment_name 我想通过作为我的信号的默认值。

notify function has a keyword argument fragment_name which I want to pass as default in my signals.

任何建议?

推荐答案

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

Your attempt with partial isn't working because by default these receivers are connected using a weak reference.

根据 Django docs


默认情况下,Django将信号处理程序存储为弱引用,所以如果您的处理程序是本地函数,则可能会被垃圾回收。为了防止这种情况,当你打电话给connect()时,传递weak = False。

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和这个部分不会被垃圾回收。

Include weak=False and this partial won't be garbage collected.

我的原始答案是下面的,采取了一种没有使用部分的方法。

My original answer is below and took an approach that wasn't using partial.

您可以在将其与post_save接收器连接之前装饰您的保存功能。从django.dispatch导入接收器

You could decorate your post save function prior to connecting it with the post_save receiver.

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中的额外内部是具有参数的装饰器

The extra inner in extra_args is for decorators that take parameters.

如果要以编程方式执行此操作的方式相同,但请注意,包括 weak = False 以包装函数n不要收集垃圾。

If you want to do this programmatically this works the same way but note that you need to include weak=False to have the wrapped function not be garbage collected.

receiver(post_save, sender=aSenderClass, weak=False)(extra_args(fragment_name="meep")(my_post_save))

或者没有包装,但是调用post_save.connect就像你原来的尝试一样, p>

Or without wrapping, but calling post_save.connect like your original attempt with partial

post_save.connect(extra_args(fragment_name="meepConnect")(my_post_save), sender=Author, weak=False)

这篇关于传递参数django signals - post_save / pre_save的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆