2013-08-21 49 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的信息,這些信息有助於跟蹤這些更改併爲您進行數據庫修改。

相關問題