2011-04-14 19 views
7

Estoy usando django-registration y estoy tratando de conectarme a sus señales para crear automáticamente un UserProfile.django-registration auto create UserProfile

Definición de la señal:

from django.dispatch import Signal 

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

señal enviada por django-registro:

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 

Mi señal de conexión: se está creando

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) 

No hace falta decir que no PerfilUsuario. ¿Que me estoy perdiendo aqui?

¡Muchas gracias!

EDIT: Moví mi conexión() y su método correspondiente a un model.py y aún no tuve suerte.

Nuevo código:

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) 

estoy usando PyCharm de depurar, y en el principio de mi punto de interrupción en user_registered.connect() es golpeado. Así que supongo que connect() se está registrando correctamente. Sin embargo, todavía no veo ejecutar createUserProfile. ¿Me falta algo más?

Gracias!

RESPUESTA: Doh. Mi código de conexión y receptor estaba mal. código correcto:

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

user_registered.connect(createUserProfile) 

di cuenta de que después de leer signals.py en django-registro

Respuesta

6

Usted necesita registro (conectar) su señal en un módulo que se importa en el inicio del servidor. Su archivo donde user_registered.connect(createUserProfile, sender=User) vive probablemente no se importa al inicio. Desde django docs:

Puede poner el código de registro en cualquier lugar que desee. Sin embargo, deberá asegurarse de que el el módulo en el que se encuentra se importe desde el principio para que el manejo de la señal se registre antes de que se envíen las señales . Esto hace que models.py de su aplicación sea un buen lugar para poner registro de controladores de señal.

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

Así models.py de su aplicación personalizada sería un buen lugar (o cualquier otro módulo, que es definitivamente importada en el inicio del servidor).

+0

He cambiado mi código de acuerdo con su respuesta, pero todavía no tuve suerte. Por favor revisa mis ediciones. ¡Muchas gracias! – rabbid

2

Torsten tiene razón: la forma alternativa es utilizar decorators como se indica en documentation:

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

me gusta esta manera porque es compacto y fácil de leer.