2010-06-23 26 views
10

Estoy usando django-registration en mi aplicación. Quiero crear diferentes tipos de usuarios con diferentes perfiles. Por ejemplo, un usuario es un profesor y otro usuario es un alumno.Registro Django y múltiples perfiles

¿Cómo puedo modificar el registro para configurar el user_type y crear el perfil correcto?

+0

tiene un tip o allí: P – jonasespelita

Respuesta

12

Respuesta larga: p

que he encontrado The Missing Manual posterior de gran valor para este tipo de problema, ya que explica muchas de las características de los perfiles de Django y sistemas de registro de Django.

me gustaría sugerir el uso de multi table inheritance en el único perfil que se permite establecer a través de la AUTH_PROFILE_MODULE

Por ejemplo

#models.py 
class Profile(models.Model): 
    #add any common fields here (first_name, last_name and email come from User) 

    #perhaps add is_student or is_teacher properites here 
    @property 
    def is_student(self): 
     try: 
      self.student 
      return True 
     except Student.DoesNotExist: 
      return False 

class Teacher(Profile): 
    #teacher fields 

class Student(Profile): 
    #student fields 

django-registro utiliza señales para notificarle de un registro. Debería crear el perfil en ese momento, por lo que está seguro de que las llamadas a user.get_profile() siempre devolverán un perfil. El código de señales utilizado es

#registration.signals.py 
user_registered = Signal(providing_args=["user", "request"]) 

Lo que significa que al manipular la señal se tiene acceso a la solicitud realizada. Por lo tanto, cuando envíe el formulario de registro, incluya un campo que identifique qué tipo de usuario crear.

#signals.py (in your project) 
user_registered.connect(create_profile) 

def create_profile(sender, instance, request, **kwargs): 
    from myapp.models import Profile, Teacher, Student 

    try: 
     user_type = request.POST['usertype'].lower() 
     if user_type == "teacher": #user .lower for case insensitive comparison 
      Teacher(user = instance).save() 
     elif user_type == "student": 
      Student(user = instance).save() 
     else: 
      Profile(user = instance).save() #Default create - might want to raise error instead 
    except KeyError: 
     Profile(user = instance).save() #Default create just a profile 

Si desea añadir nada al modelo que se crea, que no está cubierto por los valores predeterminados de campo, a la hora del registro se puede tirar, obviamente, que a partir de la solicitud.

1

http://docs.djangoproject.com/en/1.2/topics/auth/#groups

grupos de Django son una gran manera de definir lo que busca. Puede tener un User extended profile que contendrá todos los atributos de maestros y estudiantes.

class MasterProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    # add all the fields here 

a continuación, definir grupos: teacher y student y asociar cada MasterProfile ya sea a un profesor o un estudiante.

La tabla Django Group puede ayudarlo a definir sus diversas funciones y asignar usuarios a grupos correctamente.

+0

Pero, ¿cómo se diferencian los campos de esta manera?Los profesores y los estudiantes terminarán teniendo los mismos campos, ¿verdad? Por lo general, se necesitan múltiples tipos de perfil para tener diferentes campos para cada tipo de usuario. – Leonardo

1

Tuve el mismo problema y probé la respuesta sugerida por Chris, sin embargo, no funcionó para mí.

Sólo soy un novato en Django, pero creo que los argumentos tomadas por manejador create_profile deben coincidir con los menores de providing_args por la señal user_registered, y en la respuesta de Chris no lo hacen (Creo que probablemente coinciden con los pasó por la señal post_save , que he visto utilizados en el manual que falta que él cita)

he modificado su código para hacer args partido:

def create_profile(sender, **kwargs): 
    """When user is registered also create a matching profile.""" 

    request, instance = kwargs['request'], kwargs['user'] 

    # parse request form to see whether profile is student or teacher 
    try: 
     user_type = request.POST['usertype'].lower() 
     print(user_type) 
     if user_type == "teacher": #user .lower for case insensitive comparison 
      Teacher(user = instance).save() 
     elif user_type == "student": 
      Student(user = instance).save() 
     else: 
      Userprofile(user = instance).save() #Default create - might want to raise error instead 
    except KeyError: 
     Userprofile(user = instance).save() #Default create just a profile 

y parece estar funcionando ahora

Cuestiones relacionadas