Подтвердить что ты не робот

Как передать 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?

4b9b3361

Ответ 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

Но вышеуказанное не проверено, и я не уверен, что он даже сработает.