2013-08-21 47 views
1

我刚开始学习Django。虽然我试图创建一个非常简单的用户注册功能(使用PSQL),但我总是得到这样的消息:IntegrityError:“email”列中的空值违反非空约束

完整性错误:列“email”中的空值违反非空约束 我认为有东西我的数据库错了。但我不明白为什么..

我使用Django 1.5.1和PSQL 9.1.9 非常感谢你!

models.py:

from django.db import models 
class User(models.Model): 
    name = models.CharField(max_length=30) 
    email = models.EmailField(verbose_name='e-mail') 
    password = models.CharField(max_length=16) 

views.py:

from portfolioSite.forms import register_form 
from django.shortcuts import render 
from django.http import HttpResponseRedirect 
from portfolioSite.models import User 

def register(request): 
    if request.method == 'POST': 
     registerForm = register_form(request.POST) 
     if registerForm.is_valid(): 
      User.objects.create(name = registerForm.cleaned_data['name'], 
       email = registerForm.cleaned_data['email'], 
       password = registerForm.cleaned_data['password2']) 
     return HttpResponseRedirect('/success/') 
    else: 
     registerForm = register_form() 
    return render(request, 'register_form.html', {'form':registerForm}) 

回溯:

File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 
    115.       response = callback(request, *callback_args, **callback_kwargs) 
File "/home/guangyi/Django/projects/mysite/portfolioSite/views.py" in register 
    13.        password = registerForm.cleaned_data['password2'] 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py" in create 
    149.   return self.get_query_set().create(**kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in create 
    402.   obj.save(force_insert=True, using=self.db) 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py" in save 
    546.      force_update=force_update, update_fields=update_fields) 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py" in save_base 
    650.     result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw) 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py" in _insert 
    215.   return insert_query(self.model, objs, fields, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in insert_query 
    1661.  return query.get_compiler(using=using).execute_sql(return_id) 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py" in execute_sql 
    937.    cursor.execute(sql, params) 
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py" in execute 
    41.    return self.cursor.execute(sql, params) 
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/base.py" in execute 
    56.    six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2]) 
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/base.py" in execute 
    54.    return self.cursor.execute(query, args) 

Exception Type: IntegrityError at /register/ 
Exception Value: null value in column "email" violates not-null constraint 

检查我的分贝,我看到有一个名为porfolioSite_user表,但当我放弃它时,psql告诉我桌子不会退出......所以很困惑......

+1

看起来像Django希望能够为未设置的电子邮件存储'null',但是您的数据库表是在'email'列上使用'not null'约束创建的。 –

+0

在你的'registerForm'中,确保电子邮件字段是必需的。 –

回答

0

尝试在发送POST请求之前检查电子邮件字段,确保电子邮件字段在发送请求之前不为空。

2

检查您的模板以确保表单中的电子邮件字段正确提交'email'输入。如果在您点击提交时“email”之下没有提交任何内容,那可能是您问题的原因。

有许多注册应用程序,你可以安装,将摆脱你遇到的麻烦。我建议您使用django-registration-1.5,因为您使用的是带有可定制用户模型的django版本。这将是最简单的方法,但如果你这样做自我充实,Theres其他一些事情,你可以尝试,如果表格看起来好。你可以检查你的南迁移,以确保它们全都是最新的,或者如果你处于测试阶段并且数据库不重要,你可以刷新数据库以查看它是否摆脱了错误。

模型字段有两个相似的options,但做不同的事情。它们是'null=True'值和'blank=True'之一。你只有'blank=True',它是创建对象的python方面的验证器。但是,当您尝试将其保存到数据库时,您会看到一个错误,那就是这里最有可能发生的事情。由于您的'email'模型缺少其上的'null=True'选项,因为您将'null'值提交给非空约束,因此会出现错误。但是,将“null=True”添加到您的模型中并不是在这种情况下应该做的。

如果您想让自己头疼,我建议将django-registration-1.5插入您的项目并让该应用程序为您进行注册。

0

默认情况下,django模型中的所有字段都是必需的,并且不接受空值。为了让字段接受空值,您需要将null=True添加到模型字段定义中。

你的情况的问题是,表单不验证电子邮件是必需的;所以它在电子邮件领域接受空白。

另一个问题是,您使用的是被称为User当Django已经自带了与用户,权限和完整的身份认证系统模型 - 是 - 即使是注册和忘记密码的形式(见documentation更多关于这个)。该应用程序也提供User模型。

最后,django绝不会将任何破坏性更改添加到您的数据库中。这意味着如果您删除某个模型,或者删除将一列添加到模型中,syncdb命令将不会进行这些更改。您将不得不放弃数据库,然后再次运行syncdb。稍后,您可以了解有关applications like South的信息,这些信息有助于跟踪这些更改并为您进行数据库修改。

相关问题