2010-05-22 96 views
17

Estoy usando la función create_user() que Django proporciona para crear mis usuarios. También quiero almacenar información adicional sobre los usuarios. Así que traté de seguir las instrucciones dadas enAgregar campos personalizados a usuarios en django

http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

pero no puedo conseguir que funcione para mí. ¿Hay alguna guía paso a paso que pueda seguir para que esto funcione para mí?

Además, una vez que haya agregado estos campos personalizados, obviamente necesitaría agregar/editar/eliminar datos de ellos. Parece que no puedo encontrar instrucciones sobre cómo hacer esto.

+1

entonces * usted * es la función Django create_user()? :) –

+1

Pensé que era, pero desafortunadamente no lo soy :(.... Sólo un viejo humano normal ... Gracias por la corrección gramatical ax. ¿Alguna idea sobre cómo resolver mi problema real? –

Respuesta

-1

Es solo otro modelo. Lo manipulas exactamente de la misma manera que manipulas cualquier otro modelo con el que te encuentres.

16

No estoy al tanto de un paso a paso (aunque estoy seguro de que un google sólido produciría algo). Pero aquí hay un rápido avance.

1) Cree un modelo UserProfile para guardar la información adicional y ponerla en su models.py. Podría ser algo como esto:

class UserProfile(models.Model): 
    #required by the auth model 
    user = models.ForeignKey(User, unique=True) 
    middle_name = models.CharField(max_length=30, null=True, blank=True) 

2) Informe a su settings.py acerca de la nueva clase mediante la adición de esta línea (con el nombre apropiado):

AUTH_PROFILE_MODULE = "myapp.UserProfile" 

3) Añada un receptor de señales para crear una UserProfile en blanco registra cuando se agrega un nuevo usuario. Puede encontrar un gran fragmento con instrucciones here.

4) Al procesar el nuevo registro de usuario puede llenar el registro UserProfile también. Aquí es cómo hago el inserto (nótese la get_profile):

if (form.is_valid()): 
    cd = form.cleaned_data 
    user = User.objects.create_user(cd["UserName"], cd["Email"], cd["Password"]) 
    user.first_name = cd["FirstName"] 
    user.last_name = cd["LastName"] 
    user.save() 
    #Save userinfo record 
    uinfo = user.get_profile() 
    uinfo.middle_name = cd["MiddleName"] 
    uinfo.save() 

Eso es todo lo que hay que hacer. Esto no es exhaustivo, pero debe apuntarlo en la dirección correcta.

Actualización: Tenga en cuenta que AUTH_PROFILE_MODULE está obsoleta desde v1.5: https://docs.djangoproject.com/en/1.5/ref/settings/#auth-profile-module

+0

Lo he intentado. Obtiene y produce error al indicar que el objeto 'NoneType' no tiene el atributo '_default_manager'. –

+3

¿Intentó qué específicamente? ¿Dónde está obteniendo ese error? –

+0

Creó un archivo llamado UserProfile.py. Agregó el código requerido. Realizó cambios en settings.py (AUTH_PROFILE_MODULE = 'app.UserProfile'). Aparece un error al intentar guardar el segundo nombre, es decir, en la línea uinfo = usuario.get_profile() –

7

Sé que es demasiado tarde y Django ha cambiado mucho desde entonces, pero sólo para los solicitantes,

Según Django documentation si está contento con el modelo de usuario y simplemente quiere añadir algunos campos extra, hacer esto:

1- Su models.py debería ser así:

from django.contrib.auth.models import AbstractUser 
class CustomUser(AbstractUser): 
    mobile = models.CharField(max_length=16) 
    # if your additional field is a required field, just add it, don't forget to add 'email' field too. 
    # REQUIRED_FIELDS = ['mobile', 'email'] 

2- Agregue esto a la setting.py

AUTH_USER_MODEL = 'myapp.CustomUser' 

hecho!

Ahora se puede ejecutar python manage.py syncdb

+2

Esta solución funciona bien, pero no la recomendaría porque muchas bibliotecas no usan la variable 'AUTH_USER_MODEL' y asume que usa el Objeto 'Usuario'. – db0

15

El recommended way es crear un nuevo modelo y darle un OneToOneField() con la incorporada en el User modelo de este modo:

class Student(models.Model): 
    user = models.OneToOneField(User) 
    college = models.CharField(max_length=30) 
    major = models.CharField(max_length=30) 

etc.

Entonces puede acceder a los campos como este:

user = User.objects.get(username='jsmith') 
college = user.student.college 
+0

Para mí esto produce un error de programación cuando creo un nuevo usuario y trato de acceder a él: "auth_student" no sale. –

+1

Revise este enlace, https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#extending-the-existing-user-model Esta es una versión más reciente –

Cuestiones relacionadas