创建用户时,Django 给我一个完整性错误。从我的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_user 的结果)然后炸毁。我什至在导入我的模型文件后在 shell 中尝试了这个 - 仍然爆炸。这是抛出的错误:
/my_url/ 处的 IntegrityError
myApp_userprofile.age 不能为 NULL
我认为发生的是,当 Django 保存用户对象时,由于回调,它也创建了 UserProfile obj。由于它没有用于创建 UserProfile 的数据,因此由于尝试使用 NULL 作为输入创建数据库记录而引发完整性错误。
披露:我正在使用 sqlite3 并在优化我的模式时多次删除和添加表。然而,据我所知,数据库是正确的——我手动浏览了每张桌子。
我在其他任何地方都找不到这种情况的一个例子。为什么 Django 会给我一个选项来创建一个违反 DB 约束的 UserProfile 呢?在过去的两天里,我一直在为此烦恼,并非常感谢任何见解。谢谢!
编辑:刚刚删除数据库以便从头开始。创建我的超级用户帐户时,syncdb 会引发相同的错误。这到底是怎么回事?