Django - 在创建用户时创建用户配置文件

问题描述:

为了实现简单的目标,我遵循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

只是想通了。

我忘了将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://*.com/questions/17806683/create-row-of-date-while-creating-superuser – user2086641 2013-07-23 14:37:12

你不应该使用:

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

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


post_save.connect(create_profile,sender=User) 

我认为这会帮助你。