我正在连接一个自定义的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事件?
答案 0 :(得分:36)
内置信号由Django发送,因此您无法控制他们的kwargs。
你可以:
在模型实例中存储其他信息。喜欢这个
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...