首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >传递参数django信号- post_save/pre_save

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

Stack Overflow用户
提问于 2014-04-11 05:45:08
回答 4查看 17K关注 0票数 27

我正在开发Django1.6中的一个通知应用程序,我想将额外的参数传递给Django信号,比如post_save。我试着从functools中使用partial,但是没有成功。

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,我希望在我的信号中将其作为默认值传递。

有什么建议吗?

EN

回答 4

Stack Overflow用户

发布于 2014-04-18 16:00:09

您可以在model的自定义save方法中定义额外的参数,如下所示:

class MyModel(models.Model):
    ....

    def save(self, *args, **kwargs):
        super(MyModel, self).save(*args, **kwargs)
        self.my_extra_param = 'hello world'

并通过post_save信号接收器中的实例访问此附加参数:

@receiver(post_save, sender=MyModel)
def process_my_param(sender, instance, *args, **kwargs):
    my_extra_param = instance.my_extra_param
票数 28
EN

Stack Overflow用户

发布于 2014-04-25 00:16:56

如果预定义的信号不合适,您可以随时定义自己的信号。

import django.dispatch

custom_post_save = django.dispatch.Signal(providing_args=[
    "sender", "instance", "created", "raw", "using", "update_fields", "fragment_name"
])

然后在你的模型中,你只需要覆盖save()方法:

from django.db import router

class YourModel(Model):

    # Your fields and methods

    def save(self, force_insert=False, force_update=False, using=None,
         update_fields=None):
         custom_signal_kwargs = {
             "sender": self.__class__,
             "instance": self,
             "created": self.pk is None,
             "raw": False, # As docs say, it's True only for fixture loading
             "using": using or router.db_for_write(self.__class__, instance=self),
             "update_fields": update_fields,
             "fragment_name": "categories_index" # The thing you want
         }
         super(YourModel, self).save(force_insert=False, force_update=False, using=None,
             update_fields=None)
         custom_post_save.send(**custom_signal_kwargs) # Send custom signal

现在你只需要将这个自定义信号连接到你的notify(...)接收器上,它就会得到fragment_name in kwargs。

票数 4
EN

Stack Overflow用户

发布于 2020-04-09 01:58:31

我尝试了尤金·索尔达托夫的答案,但它让我意识到它可以简单得多:

你可以有类似这样的东西:

obj = MyModel.objects.first()
obj.my_extra_param = "hello world"
obj.save() # this will trigger the signal call

然后让接收器像尤金的答案那样工作,一切都是一样的。

@receiver(post_save, sender=MyModel)
def process_my_param(sender, instance, *args, **kwargs):
    my_extra_param = instance.my_extra_param

不需要创建容易出现错误的自定义保存方法。

这就是目前在Django 3.0中的工作方式。我没有尝试过以前的版本。

为什么会发生这种情况?好的旧文档已经为您提供了答案:https://docs.djangoproject.com/en/3.2/ref/models/instances/#what-happens-when-you-save

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22999630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档