2012-07-15 53 views
18

Estoy siguiendo la documentación de Django here para lograr un objetivo simple: Crear un perfil de usuario tan pronto como se cree un nuevo usuario.Django - Crear perfil de usuario en la creación del usuario

Tengo una aplicación 'cuentas' y mis accounts.models se ve así:

# -*- coding: utf-8 -*- 
from django.db import models 
from django.db.models.signals import post_save 
from django.contrib.auth.models import User 
from main.models import Store 

class UserProfile(models.Model): 

    GENRE_CHOICES = (
     ('m', 'Masculino'), 
     ('f', 'Feminino'), 
    ) 
    MARITAL_STATUS_CHOICES = (
     ('s', 'Solteiro'), 
     ('c', 'Casado'), 
     ('d', 'Divorciado'), 
     ('v', 'Viúvo'), 
    ) 

    user = models.ForeignKey(User, unique=True) 
    birth_date = models.DateField() 
    genre = models.CharField(max_length=1, choices=GENRE_CHOICES) 
    address = models.CharField(max_length=150) 
    postal_code_4 = models.PositiveIntegerField() 
    postal_code_3 = models.PositiveIntegerField() 
    locatity = models.CharField(max_length=30) 
    marital_status = models.CharField(max_length=1, choices=MARITAL_STATUS_CHOICES) 
    child_amount = models.PositiveSmallIntegerField() 
    is_merchant = models.BooleanField(default=False) 
    store = models.ForeignKey(Store, null=True) 

def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     UserProfile.objects.create(user=instance) 

post_save.connect(create_user_profile, sender=User) 

Todo se ve bien para mí, pero cuando se trata de añadir un nuevo usuario (mediante administración de Django), en lugar de tener una usuario recién creado y el perfil de usuario, me sale el siguiente error: InternalError en/admin/auth/user/add/ transacción actual se aborta, comandos ignorado hasta el final del bloque de transacción

Aquí es la parte de error de seguimiento :

/djangoProjects/lwboanova/lwboanova/apps/accounts/models.py in create_user_profile 

34: UserProfile.objects.create(user=instance) 

Parece un error de integridad, pero ahora no recibo la razón para ello.

Estaría genial si alguno de ustedes pudiera ayudarme con esto.

+3

¿Tiene instalada la barra de herramientas django? Si es así, intenta deshabilitarlo para que obtengas una mejor información de error. –

Respuesta

14

Lo acabo de descubrir.

Olvidé agregar null=True al resto de UserProfile campos modelo.

Así los campos accounts.models.UserProfile ahora queda como:

user = models.ForeignKey(User, unique=True) 
birth_date = models.DateField(null=True) 
genre = models.CharField(max_length=1, choices=GENRE_CHOICES, null=True) 
address = models.CharField(max_length=150, null=True) 
postal_code_4 = models.PositiveIntegerField(null=True) 
postal_code_3 = models.PositiveIntegerField(null=True) 
locatity = models.CharField(max_length=30, null=True) 
marital_status = models.CharField(max_length=1, choices=MARITAL_STATUS_CHOICES, null=True) 
child_amount = models.PositiveSmallIntegerField(null=True) 
is_merchant = models.BooleanField(default=False) 
store = models.ForeignKey(Store, null=True) 

... y todo funciona según lo previsto!

Saludos para tratar de ayudar a Ashray ^^

+0

, ¿podría consultarme y guiarme, ASÍ pregunta http://stackoverflow.com/questions/17806683/create-row-of-date-while-creating-superuser – user2086641

14

No use:

user = models.ForeignKey(User, unique=True) 

En lugar de utilizar esto:

from django.conf import settings 
.. 
user = models.OneToOneField(settings.AUTH_USER_MODEL) 
+0

Tiene razón acerca de OneToOneField, pero una relación con el modelo de usuario está bien. Es decir, si extiende la construcción en Usuario con campos adicionales. Solo use la configuración 'AUTH_USER_MODEL' si desea reemplazar la compilación en el modelo de Usuario con el suyo. – allcaps

+3

@allcaps Última frase es engañosa. 'settings.AUTH_USER_MODEL' es una forma de proteger este fragmento de código de un error de regresión si el' 'usuario '' codificado ya no es el modelo en el futuro. – JSmyth

0
def create_profile(sender,**kwargs): 
    if kwargs['created']: 
     user_profile=UserProfile.objects.create(user=kwargs['instance']) 


post_save.connect(create_profile,sender=User) 

creo que esto le ayudará.

Cuestiones relacionadas