由于UserProfile创建引发IntegrityError,无法创建Django用户

由于UserProfile创建引发IntegrityError,无法创建Django用户,django,creation,user-profile,Django,Creation,User Profile,Django在创建用户时给了我一个完整性错误。从my models.py: class UserProfile(models.Model): user = models.OneToOneField(User) age = models.DateField() city = models.CharField(max_length=30) state = models.CharField(max_length=20) country = models.Cha

Django在创建用户时给了我一个完整性错误。从my models.py:

class UserProfile(models.Model):
    user = models.OneToOneField(User)

    age = models.DateField()
    city = models.CharField(max_length=30)
    state = models.CharField(max_length=20)
    country = models.CharField(max_length=30)
    primary_language = models.CharField(max_length=30)
    secondary_language = models.CharField(max_length=30, blank=True, null=True)
    tertiary_language = models.CharField(max_length=30, blank=True, 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。转到views.py,我在其中创建用户:

def create_user_and_profile(request):
    form = RegistrationForm(request.POST)
    if form.is_valid():
        # User is saved to DB here
        user = User.objects.create_user( 
            username = form.cleaned_data['username'],
            password = form.cleaned_data['password1'],
            email = form.cleaned_data['email']
        )
        user.first_name = form.cleaned_data['first_name']
        user.last_name = form.cleaned_data['last_name']
        user.save()
        # TODO remaining user creation code goes here
        profile = user.get_profile()

        profile.age = form.cleaned_data['age'],
        profile.city = form.cleaned_data['city'],
        profile.state = form.cleaned_data['state'],
        profile.country = form.cleaned_data['country'],
        profile.primary_language = form.cleaned_data['primary_language'],
        profile.secondary_language = form.cleaned_data['secondary_language'],
        profile.tertiary_language = form.cleaned_data['tertiary_language']
        profile.save()
        return user
    else:
        variables = RequestContext(request, {'form': form})
        return render_to_response('registration/register.html', variables)
Django将创建用户对象(作为user.objects.create\u user的结果),然后放大。在导入模型文件后,我甚至在shell中尝试了这一点,但仍然失败了。下面是引发的错误:

位于/my_url的IntegrityError/

myApp_userprofile.age不能为空

我认为发生的是,当Django保存用户对象时,由于回调,它也创建了UserProfile对象。由于它没有用于创建UserProfile的数据,因此由于试图创建以NULL作为输入的数据库记录,它会抛出完整性错误

披露:我正在使用sqlite3,在优化模式时多次删除和添加表。然而,正如我所能说的,DB是正确的——我用手浏览了每一张表

我在其他任何地方都找不到这样的例子。为什么Django会给我一个选项来创建一个违反DB约束的用户配置文件呢?在过去的两天里,我一直在为这件事发牢骚,如果有任何见解,我将不胜感激。谢谢


编辑:为了从头开始,刚刚删除了数据库。syncdb在创建我的超级用户帐户时抛出相同的错误。到底发生了什么事?

你有没有检查年龄是否为空? 为什么不通过userprofile创建用户?我的意思是:

profile.first_name = 'abc'
profile.last_name = 'abc'
profile.age = Date(2000, 1, 1)
profile.save()

我认为您必须在settings.py中添加
AUTH\u PROFILE\u模块
,以便在保存新用户后自动创建用户配置文件。你查过文件了吗

回答了我自己的问题。当用户被创建和保存时,UserProfile也会被创建/保存——我们知道这一点。我不知道的是,日期、布尔值和整数不能如前所述为空。因此,解决方案是更改UserProfile类的这一行:

age = models.DateField()


这允许用户配置文件在不填充的情况下保存到数据库中,并且允许我使用get_profile()检索并稍后填充它。

是的,完成了-我在文章中引用了相同的文档。正如我所说,问题似乎与创建UserProfile w/null值有关。这就是代码爆炸的地方。正如我之前写的,您是否检查了年龄是否为空:)
age = models.DateField(null=True)