2011-04-14 2 views
7

나는 django-registration을 사용하고 있으며, 자동으로 UserProfile을 만들기 위해 신호에 연결하려고합니다.django-registration 자동 생성 UserProfile

신호 정의 :

from django.dispatch import Signal 

# A new user has registered. 
user_registered = Signal(providing_args=["user", "request"]) 

신호 장고 등록하여 보내

def register(self, request, **kwargs): 
    """ 
    Create and immediately log in a new user. 

    """ 
    username, email, password = kwargs['username'], kwargs['email'], kwargs['password1'] 
    User.objects.create_user(username, email, password) 

    # authenticate() always has to be called before login(), and 
    # will return the user we just created. 
    new_user = authenticate(username=username, password=password) 
    login(request, new_user) 
    signals.user_registered.send(sender=self.__class__, 
           user=new_user, 
           request=request) 
    return new_user 

내 신호 연결 :

from registration.signals import * 
from core.models import UserProfile 
from django.contrib.auth.models import User 

def createUserProfile(sender, instance, **kwargs): 
    UserProfile.objects.get_or_create(user=instance) 

user_registered.connect(createUserProfile, sender=User) 

에는 사용자 프로필을 말할 나위가 생성되고있다. 내가 여기서 무엇을 놓치고 있니?

고맙습니다.

편집 : connect()와 해당 메소드를 model.py로 옮겼지만 여전히 운이 없다.

새로운 코드 :

from django.db import models 

from django.contrib import auth 
from django.contrib.auth import login 
from core.forms import AuthForm 
from registration.signals import * 
from django.contrib.auth.models import User 


# Create your models here. 

class UserProfile(models.Model) : 
    user = models.ForeignKey(User, unique=True) 

    def __unicode__(self): 
     return self.user.username 


def createUserProfile(sender, instance, **kwargs): 
    print "creating profile" 
    UserProfile.objects.get_or_create(user=instance) 

user_registered.connect(createUserProfile, sender=User) 
디버깅 내가 Pycharm을 사용하고

및 user_registered.connect에 매우 시작 내 중단 점에서()는 맞았다. 그래서 connect()가 올바르게 등록되었다고 가정합니다. 그러나, 나는 여전히 실행중인 createUserProfile을 볼 수 없습니다. 내가 놓친 게 있니?

감사합니다.

답 :도. 연결 코드와 수신자 코드가 잘못되었습니다. 올바른 코드 : I는 서버 시작에 수입 된 모듈에

당신은 등록해야

답변

6

(연결) 장고 등록에 신호를 signals.py을 읽은 후

def createUserProfile(sender, user, request, **kwargs): 
UserProfile.objects.get_or_create(user=user) 

user_registered.connect(createUserProfile) 

을 실현. user_registered.connect(createUserProfile, sender=User)이 사는 파일은 시작할 때 가져올 가능성이 없습니다. django 문서에서 :

신호 처리 및 등록 코드를 원하는 곳 어디에서나 사용할 수 있습니다. 그러나 모듈을 가져 오기 전에 을 먼저 가져 오면 신호가 전송되기 전에 신호 처리가 으로 등록되어야합니다. 이렇게하면 앱의 models.py에 신호 핸들러 등록 을 넣을 수 있습니다.

http://docs.djangoproject.com/en/dev/topics/signals/#connecting-receiver-functions

사용자 정의 응용 프로그램의 그래서 models.py

좋은 장소 (또는 확실히 서버 시작에 가져온 다른 모듈) 일 것이다.

+0

답변에 따라 코드가 변경되었지만 여전히 운이 없습니다. 제 편집 내용을 확인하십시오. 고마워요! – rabbid

2

스텐은 맞다 : 컴팩트하고 읽기 때문에

from registration.signals import user_registered 
    # ... 
    @receiver(user_registered) 
    def your_function_name_here(sender, user, request, **kwargs): 
      # your code here 
      pass 

나는이 방법을 좋아한다 : 대체 방법은 documentation에 명시된 바와 같이 decorators을 사용하는 것입니다.