3

我刚开始学习Django。虽然我正在尝试创建一个非常简单的用户注册函数(使用 PSQL),但我总是收到以下消息:

完整性错误:“电子邮件”列中的空值违反了非空约束我认为我的数据库有问题。但我想不通为什么..

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

模型.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)

视图.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 告诉我该表没有退出......所以很困惑......

4

3 回答 3

3

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

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

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

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

于 2013-12-09T05:17:26.097 回答
1

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

您的问题是表单无法验证是否需要电子邮件;所以它接受电子邮件字段中的空白。

User另一个问题是,当 django 已经带有完整的身份验证系统时,您使用的模型称为用户、权限和 - 是的 - 甚至是注册和忘记密码表单(请参阅文档中的更多信息)。这个应用程序也提供了一个User模型。

最后,django 永远不会对您的数据库进行任何破坏性更改。这意味着如果您删除一个模型,或者删除向模型添加一列,该syncdb命令将不会进行这些更改。您将不得不删除数据库,然后syncdb再次运行。稍后您可以了解类似的应用程序South,以帮助跟踪这些更改并为您进行数据库修改。

于 2013-12-09T05:37:59.940 回答
0

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

于 2013-08-21T20:54:34.550 回答