2012-04-24 2 views
19

사용자 정의 post_save 신호를 연결하고 kwargs 집합을 전달하는 쉬운 방법을 찾지 못하는 것으로 보입니다. 의 I는 다음과 같은 (그러나 어떤 kwargs로를 얻을 수 없다)save에서 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 후크 내부 그리고

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 이벤트에서 저장 하시겠습니까?

+0

처럼 나는 (비 사용자 속성) (장고 사용자 자체에서 격리) 사용자 프로필에 사는 것이 다른 인수 전달에 관심이 있어요. 게시물 저장은 위와 같은 작업을 수행하기에 좋은 장소처럼 보였습니다 ... 외부 변수를 사용할 수 없다는 점만 제외하면. 나는 당신의 제안을 시도 할 것이고, 그것이 작동한다면 post back (post_save 신호 자체에 ** kwargs를 이용하고 싶지만) –

+0

나는 신호가 좋은 생각이라고 생각하지 않는다. 객체가 코드의 다른 부분에서 생성 될 때 (앱 외부에서도 가능함) 신호가 유용합니다. 그러나 당신의 경우에는 객체가 폼 외부에서 생성되면 신호가 쓸모가 없습니다. 그래서 가장 합리적인 방법은 폼의 저장에 직접'User'와 프로파일을 만드는 것입니다. 구현하기 쉽고 나중에 코드를 이해하기 쉽습니다. – DrTyrsa

+0

나는 대부분의 사람들 (ok, 아마도 나)이 postprofile을 만들고 post_save()가 아니라 overridden 된 save() 메소드를 사용한다고 믿는다. 그러나 귀하의 요구 사항은 다를 수 있습니다. 여하튼, 프로필이 이미 생성 되었다면 post_save에서도'instance.get_profile()'을 호출 할 수있다. – alan

답변

28

기본 제공 신호는 장고에 의해 보내 지므로 해당 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... 
    
+0

+1 내 대답이 내 것보다 낫습니다. 나는 getattr()을 사용해야한다고 생각 했어야했다. 또한'instance'를 사용하여 추가 속성을 전달할 수 있다는 것을 확인해 주셔서 감사합니다. – alan

+0

'user.save()'다음에'self.save_m2m()'을 호출하면 어떨까요? 그게 필요하지 않니? – thnee

2

나는 kwargs의 별도 세트를 전달할 방법이 없다고 생각합니다. User 속성 외에도 원하는 것은 무엇입니까? instance 인수에서 신호 처리기의 User 속성에 액세스 할 수 있습니다. instance은 방금 저장 한 User 개체가됩니다. 핸들러에서 다음

def save(self, commit=True): 
    user = super(CustomFormThing, self).save(commit=False) 
    user.foo = 'bar' 
    if commit: 
     user.save() 
    ... 

: 당신이 함께 전달해야 할 다른 일이있는 경우

, 당신이 캐리어 비둘기로 instance 인수를 사용하려고 할 수도있을 것 같군요

def create_profile(sender, instance, created, **kwargs): 
    myfoo = instance.foo 

그러나 위는 테스트되지 않았으므로 작동 여부를 확신 할 수 없습니다.

관련 문제