Как пройти kwargs из сохранить, чтобы после сохранения сигнала


Я подключаю пользовательский сигнал 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 из сохранения в событие post_save?

2 20

2 ответа:

Встроенные сигналы посылаются Django, поэтому вы не можете управлять их кваргами.

Вы можете:

    Определите и пошлите свои собственные сигналы.
  1. Храните дополнительную информацию в экземпляре модели. Вот так

    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...
    

Я не думаю, что есть способ передать отдельный набор кваргов. Какие args вы хотите в дополнение к атрибутам 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
Но вышеизложенное непроверено, и я не уверен, что оно будет даже работать.