2012-05-24 2 views
4

가진 읽은 문서,django 사용자를 업데이트 할 때 post_save 신호를 보내려면 어떻게해야합니까?

https://docs.djangoproject.com/en/dev/topics/signals/

난 내 signals.py 파일이 만든 : 내가 읽은 것을에서, 모든했다

from django.db.models.signals import post_save 
from django.dispatch import receiver 
from models import User 

from models import Story 

@receiver(post_save, sender=User) 
def create_initial_story(sender,instance, signal, created, **kwargs): 
    print "helloooo!" 
    if created: 
     Story(user = instance, title = 'Random Stories', description="Random stories", is_closed = False, is_random = True).save() 

은 내가 생각 메시지를 보내려면해야했다. 글쎄, 그건 새로운 사용자를 만든다. (장고 등록 프레임 워크를 사용한다.)하지만 아무 것도 보내지 않고있다.

@receiver(post_save) 

을두고 있지만 그 문제를 도움이되지 않았다 - 나는 또한 @receiver 주석에 "보낸 = 사용자"매개 변수를 제거했습니다. 콘솔에 아무 것도 출력되지 않고 새로운 데이터가 저장되지 않습니다 ... 은 사용자가 저장 될 때 신호를 사용자에게 보내야합니까 ?? 그렇다면 어떻게해야할까요? 난 장고 등록을 사용하고, 그래서 내가 정의한 UserProfile을 가지고 ... 내가 무슨 뜻인지, (어떤 파일/방법에서) 사용자에게 신호를 보내라고 말할 것인가?

답변

9

실행하려면 signals.py을 가져와야합니다. 예 : models.py.

+0

흠, 내가 파이썬에 조금 익숙하다. 그래서 import signals 행을 제외하고 models.py에서 * call * 할 필요가 있는가? 아니면 그냥 가져 와서 그대로 둘 수 있을까요? – bharal

+4

@bharal 바로 가져 오기. 어떻게 든 그것을 실행해야합니다. 또한'signals.py'에서'django.db.models.get_model'을 사용하여 순환 가져 오기를 방지하십시오. – DrTyrsa

5

먼저 이것을 "데코레이터"라고합니다. 어노테이션은 장고에서 다른 것입니다. 따라서 용어를 혼동하지 않는 것이 좋습니다.

신호가 저장 될 때마다 이름에서 알 수 있듯이 post_save 신호가 호출됩니다. sender을 지정하면 수신자가 해당 모델의 저장을 위해 보낸 post_save 신호로 제한됩니다. 그것을 생략하면 모델이 저장 될 때 수신기가 호출됩니다. 이는 확실히 원하는 것은 아닙니다.

귀하의 문제는 귀하의 수신자가 모든 목적과 목적을 위해 이 존재하지 않는다는 것입니다.. Django는 자동으로 signals.py을 가져 오지 않으므로 결코 볼 수 없습니다. 그것을 볼 수있는 유일한 방법은 Django가 보게되는 models.py (@DrTyrsa와 같이)와 같은 어딘가에서 가져 오는 것입니다.

그러나 이렇게하면 models.py를 이미 signals.py로 가져 오기 때문에 순환 가져 오기 오류가 발생합니다. 따라서 신호 코드를 models.py에 직접 넣거나 가져올 다른 곳을 찾을 수도 있습니다. __init__.py 일할 수도 있지만 일반적으로 항상 내 신호를 models.py에 넣고 하루 만 부릅니다.

+1

또는'django.db.models.get_model'을 사용하십시오. :-) – DrTyrsa