2012-07-15 9 views
18

Ich folge Django Dokumentation here, um ein einfaches Ziel zu erreichen: Erstellen Sie ein Benutzerprofil, sobald ein neuer Benutzer erstellt wird.Django - Benutzerprofil bei der Benutzererstellung erstellen

Ich habe ein ‚Konten‘ App und mein accounts.models sieht wie folgt aus:

# -*- 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) 

Alles sieht mir gut, aber wenn Sie einen neuen Benutzer hinzuzufügen versucht (mit django admin), anstatt einem von mit neu erstellten Benutzer und Benutzerprofil, erhalte ich folgende Fehlermeldung: InternalError bei/admin/auth/user/add/ aktuelle Transaktion abgebrochen wird, ignoriert Befehle bis zum Ende des Transaktionsblock

Hier ist der Teil Zurückverfolgungsfehler :

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

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

Es scheint wie ein Integritätsfehler, aber ich bekomme nicht den Grund dafür.

Wäre toll, wenn jemand von euch mir dabei helfen könnte.

+3

Haben Sie die Django-Symbolleiste installiert? Wenn ja, versuchen Sie es zu deaktivieren, damit Sie bessere Fehlerinformationen erhalten. –

Antwort

14

Ich habe es herausgefunden.

Ich habe vergessen, null=True zu den restlichen UserProfile Modellfeldern hinzuzufügen.

So sind die accounts.models.UserProfile Felder sieht nun wie:

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) 

... und alles wie vorgesehen funktioniert!

Beifall für den Versuch Ashray zu helfen ^^

+0

, können Sie bitte überprüfen und führen Sie mich, SO Frage http://stackoverflow.com/questions/17806683/create-row-of-date-while-creating-superuser – user2086641

14

Sie sollten nicht verwendet werden:

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

Stattdessen verwenden:

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

Sie haben Recht mit dem OneToOneField, aber eine Beziehung zu Das Benutzermodell ist in Ordnung. Das heißt, wenn Sie den Build-Benutzer mit zusätzlichen Feldern erweitern. Verwenden Sie nur die Einstellung 'AUTH_USER_MODEL', wenn Sie das Build-Benutzermodell durch Ihr eigenes Modell ersetzen möchten. – allcaps

+3

@allcaps Letzter Satz ist irreführend. 'settings.AUTH_USER_MODEL' ist eine Möglichkeit, dieses Codeelement vor einem Regressionsfehler zu schützen, wenn der fest codierte' Benutzer' in Zukunft nicht mehr das Modell ist. – 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) 

ich denke, das Ihnen helfen.