2012-07-15 103 views
18

爲了實現簡單的目標,我遵循Django文檔here:創建新用戶後立即創建用戶配置文件。Django - 在創建用戶時創建用戶配置文件

我有一個「賬戶」,應用程序和我accounts.models看起來是這樣的:

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

一切看起來沒什麼問題,但嘗試添加新用戶時(使用Django管理),而不是有新創建的用戶和用戶配置文件,我得到以下錯誤: InternalError該在/管理/認證/用戶/添加/ 當前事務被中止,忽略,直到事務塊

這裏結束命令是追蹤誤差部分:

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

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

這似乎是一個完整性錯誤,但我沒有得到它的原因。

如果有任何雅可以給我一些幫助,這將是偉大的。

+3

您是否安裝了django工具欄?如果是這樣,請嘗試禁用它,以便獲得更好的錯誤信息。 – 2012-07-15 02:50:37

回答

14

只是想通了。

我忘了將null=True添加到UserProfile模型字段的其餘部分。

所以accounts.models.UserProfile領域現在看起來像:

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) 

...,一切都如預期運行!

乾杯試圖幫助Ashray ^^

+0

,你可以請檢查和指導我,所以問題http://stackoverflow.com/questions/17806683/create-row-of-date-while-creating-superuser – user2086641 2013-07-23 14:37:12

14

你不應該使用:

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

而是使用此:

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

你是正確的OneToOneField,但與用戶模式很好。也就是說,如果使用其他字段在User中擴展構建。如果您想用自己的模型替換用戶模型中的版本,請僅使用'AUTH_USER_MODEL'設置。 – allcaps 2014-11-24 21:32:53

+3

@allcaps最後一句話有誤導性。 'settings.AUTH_USER_MODEL'是一種保護這段代碼免受迴歸bug影響的方法,如果硬編碼User'不再是未來的模型。 – JSmyth 2016-10-23 11:42:02

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


post_save.connect(create_profile,sender=User) 

我認爲這會幫助你。

相關問題