如何将kwargs从save传递到post_save信号

时间:2012-04-24 13:36:46

标签: python django

我正在连接一个自定义的post_save信号,并注意到我似乎无法找到一种简单的方法来传递一组kwargs。

在保存期间(在自定义表单中)

def save(self, commit=True):
    user = super(CustomFormThing, self).save(commit=False)
    #set some other attrs on user here ...
    if commit:
        user.save()

    return user

然后在我的自定义post_save钩子里面,我有以下内容(但从来没有得到任何kwargs)

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    some_id = kwargs.get('some', None)
    other_id = kwargs.get('other', None)

    if created:
        #do something with the kwargs above...

如何将kwargs从save保存到post_save事件?

3 个答案:

答案 0 :(得分:36)

内置信号由Django发送,因此您无法控制他们的kwargs。

你可以:

  1. 定义并发送您自己的信号。
  2. 在模型实例中存储其他信息。喜欢这个

    def save(self, commit=True):
        user = super(CustomFormThing, self).save(commit=False)
        #set some other attrs on user here ...
        user._some = 'some'
        user._other = 'other'
        if commit:
            user.save()
    
        return user
    
    @receiver(post_save, sender=User)
    def create_profile(sender, instance, created, **kwargs):
        some_id = getattr(instance, '_some', None)
        other_id = getattr(instance, '_other', None)
    
        if created:
            #do something with the kwargs above...
    

答案 1 :(得分:2)

我认为没有办法通过一套单独的kwargs。除User属性外,您还想要什么?您可以访问User参数上的信号处理程序中的instance属性。 instance将成为刚刚保存的User对象。

如果您想传递其他内容,我想您可以尝试使用instance arg作为信鸽:

def save(self, commit=True):
    user = super(CustomFormThing, self).save(commit=False)
    user.foo = 'bar'
    if commit:
        user.save()
    ...

然后在处理程序中:

def create_profile(sender, instance, created, **kwargs):
    myfoo = instance.foo

但上述情况尚未经过测试,我不确定它是否会奏效。

答案 2 :(得分:0)

我们可以传递以下其他参数:

def save(self, commit=True):
    user = super(CustomFormThing, self).save(commit=False)
    #set some other attrs on user here ...
    if commit:
        user.save(signal_kwargs={'_some': 'some', '_other': 'other'})

    return user

您可以通过以下保存方式获取它:

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    some_id = kwargs.get('some', None)
    other_id = kwargs.get('other', None)
    if created:
        #do something with the kwargs above...