31

我正在连接一个自定义的 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 事件?

4

3 回答 3

44

内置信号由 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...
    
于 2012-04-24T13:49:05.887 回答
2

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

如果您还有其他要传递的东西,我想您可以尝试将instancearg 用作信鸽:

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

但是以上内容未经测试,我不确定它是否会起作用。

于 2012-04-24T13:46:36.500 回答
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

您可以从 post save 方法中获取它,例如:

@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...
于 2020-07-21T06:18:23.097 回答