我刚开始学习Django。虽然我正在尝试创建一个非常简单的用户注册功能(使用PSQL),但我总是得到这样的信息:
完整性错误:“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告诉我表没有退出......太混乱....
答案 0 :(得分:3)
检查您的模板,确保表单中的电子邮件字段正确提交“email
”输入。如果您在点击提交时在“email
”下提交任何内容,则可能是您遇到问题的原因。
您可以安装许多注册应用,以解决您遇到的麻烦。我推荐django-registration-1.5
,因为您使用的版本是django版本和可自定义的用户模型。这将是最简单的方法,但如果您正在为自我丰富这样做,那么如果表单显示正常,您还可以尝试其他一些事情。您可以检查您的南迁移以确保它们都是最新的,或者如果您正在测试阶段且数据库无关紧要,您可以刷新数据库以查看它是否消除了错误。 / p>
模型字段有两个相似的options,但做了不同的事情。它们是“null=True
”值和“blank=True
”值。你只有'blank=True
',它是创建对象的python方面的验证器。但是,当您尝试将其保存到数据库时,您将收到错误,这就是最有可能发生的事情。由于您的“email
”模型缺少“null=True
”选项,因此您会收到错误,因为您要向非空约束提交“null
”值。但是,在这种情况下,将“null=True
”添加到模型中是不正确的。
如果您想让自己头疼,我建议将django-registration-1.5
插入您的项目并让该应用为您进行注册。
答案 1 :(得分:1)
在发送POST请求之前,请尝试检查电子邮件字段,确保在发送请求之前电子邮件字段不为NULL。
答案 2 :(得分:1)
默认情况下,django模型中的所有字段都是必需的,并且不接受空值。为了使字段接受空值,您需要将null=True
添加到模型字段定义中。
您的案例中的问题是表单不验证是否需要电子邮件;所以它接受电子邮件领域的空白。
另一个问题是,当django已经附带一个包含用户,权限和 - 是 - 甚至是注册和忘记密码表单的完整身份验证系统时,您正在使用名为User
的模型(请参阅{ {3}})。此应用程序也提供User
模型。
最后,django永远不会对您的数据库进行任何破坏性更改。这意味着如果删除模型或删除向模型添加列,syncdb
命令将不会进行这些更改。您必须删除数据库,然后再次运行syncdb
。稍后,您可以了解有助于跟踪这些更改的documentation并为您进行数据库修改。