Как передать kwargs из save в post_save сигнал
Я подключаю пользовательский сигнал 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 hook у меня есть следующее (но никогда не получаю никаких 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 из сохранения в событие post_save?
Ответы
Ответ 1
Встроенные сигналы отправляются 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...
Ответ 2
Я не думаю, что есть способ передать отдельный набор kwargs. Какие аргументы вы хотите в дополнение к атрибутам User
? Вы можете получить доступ к атрибутам User
в обработчике сигнала в аргументе instance
. instance
будет User
объектом, который только что был сохранен.
Если есть другие вещи, которые вы хотите передать, я полагаю, вы могли бы попытаться использовать arg instance
в качестве несущего голубя:
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
Но вышеуказанное не проверено, и я не уверен, что он даже сработает.