2013-04-01 59 views
0

好吧,所以我搜索了這個高,低兩個文檔,並且谷歌上的幾乎每一頁都告訴我我的代碼應該是合法的。Django IntegrityError(1048,「Column'network_id'不能爲空」)

讓我先models.py:

class Network(models.Model): 
    title = models.CharField(max_length=50) 
    description = models.CharField(max_length=500) 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 

    def __unicode__(self): 
     return self.id 

class NetworkForm(ModelForm): 
    class Meta: 
     model = Network 

class Range(models.Model): 
    network = models.ForeignKey(Network) 
    range_start = models.GenericIPAddressField(unpack_ipv4=True) 
    range_end = models.GenericIPAddressField(unpack_ipv4=True) 
    range_title = models.CharField(max_length=50) 
    range_description = models.CharField(max_length=300) 

    def __unicode__(self): 
     return self.range_title 

class RangeForm(ModelForm): 
    class Meta: 
     model = Range 
     exclude = ('network',) 

然後我views.py:

@login_required(login_url='/login/') 
def add_network(request): 

    if request.method == "POST": 
     net_form = NetworkForm(request.POST) 
     range_formset = RangeForm(request.POST) 
     if net_form.is_valid and range_formset.is_valid: 
      net_form.save(commit=False) 
      range_formset.network = net_form 
      range_formset.save() 
      net_form.save() 

     return HttpResponseRedirect('/') 
    else: 
     net_form = NetworkForm() 
     range_form = RangeForm() 
     return render_to_response('networks/add.html', { 
      "net_form": net_form, 
      "range_form": range_form, 
     }, context_instance=RequestContext(request)) 

而且我的模板:

{% extends 'base.html' %} 

{% block title %}Add Network{% endblock %} 

{% block content %} 
<div class="row-fluid"> 
    <div class="span7 offset2 well"> 
     <h3>Add network:</h3> 
     <hr /> 
     <form class="form-horizontal" method="post" action=""> 
      {% csrf_token %} 
      {{ net_form }} 
      <h4>Add a range to the network:</h4> 
      <hr /> 
      <div class="form-inline"> 
       {{ range_form }} 
      </div> 
      <hr /> 
      <button type="submit" class="btn btn-primary btn-large">Add network</button> 
     </form> 
    </div> 
</div> 

{%端塊%}

現在,最明顯的東西了我在這裏失蹤,只是沒有做出最後的連接。如果有人能夠啓發我,那會很棒。 PS:如果有人想知道我通過查看MySQL Workbench,MySQL Commandline客戶端和manage.py dbshel​​l和inspectdb驗證了我的模型,那麼所有id列都存在。我甚至放棄了整個數據庫,並用manage.py重新創建了它。

它一直在磨我的齒輪大約一個星期了,所以有時間尋求幫助。如果有人願意幫我解決這個問題,那就太棒了!

這裏是回溯:

Environment: 


Request Method: POST 
Request URL: http://localhost:8000/network/add/ 

Django Version: 1.5 
Python Version: 2.7.3 
Installed Applications: 
('django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.admin', 
'django_nose', 
'networks') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware') 


Traceback: 
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 "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/decorators.py" in _wrapped_view 
    25.     return view_func(request, *args, **kwargs) 
File "/home/alexander/PycharmProjects/NOC/networks/views.py" in add_network 
    29.    range_form.save() 
File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py" in save 
    370.        fail_message, commit, construct=False) 
File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py" in save_instance 
    87.   instance.save() 
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 
    1673.  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/mysql/base.py" in execute 
    127.     six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2]) 
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/mysql/base.py" in execute 
    120.    return self.cursor.execute(query, args) 
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py" in execute 
    174.    self.errorhandler(self, exc, value) 
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py" in defaulterrorhandler 
    36.  raise errorclass, errorvalue 

Exception Type: IntegrityError at /network/add/ 
Exception Value: (1048, "Column 'network_id' cannot be null") 

回答

3

你至少有四個錯誤。

首先,您必須實際上致電is_valid:它是一種方法,而不是一個屬性。

其次,form.save(commit=False)返回模型實例。它不會神奇地將表單對象轉換爲實例。您需要將其分配給一個變量,然後您可以設置其他屬性。

第三,你對錯誤的對象做了commit=False--你應該在你隨後想要修改的對象上做這件事。

四,除非表格有效,否則不要重定向。

這樣:

range_form = RangeForm(request.POST) 
if net_form.is_valid() and range_form.is_valid(): 
    net_obj = net_form.save() 
    range_obj = range_form.save(commit=False) 
    range_obj.network = net_obj 
    range_obj.save() 
    return HttpResponseRedirect('/') 
else: 

    net_form = NetworkForm() 
    range_form = RangeForm() 

return render_to_response('networks/add.html', { 
    "net_form": net_form, 
    "range_form": range_form, 
}, context_instance=RequestContext(request)) 

(別叫事情表單集時,他們不是,他們只是形成除了當然你實際上也許應該使用內聯表單集的範圍形式,但這是一個單獨的問題。)

+0

我顯然是一個Django的初學者。雖然我改編了你所說的變化,但是錯誤仍然存​​在,儘管我認爲它是我的錯,因爲我曾經說過我多次檢查過數據庫,但現在認爲這是錯誤的,我看到它說:'列'network_id'不能爲空',儘管Django爲我創建的表沒有'network_id'列,它有一個名爲'id'的列。所以我再次丟棄了整個數據庫庫,使用'./manage.py syncdb'重新安裝了它,並且仍然抱怨沒有列'network_id'。任何想法如何我可以解決這個問題? –

+0

對不起,這是什麼? network_id不能爲null,或者沒有列network_id?你在檢查哪個表 - network_id在範圍表上。 –

+0

確切的錯誤是''列'network_id'不能爲空'「,而且你是對的,這是來自範圍表,並且是正確的。我不明白爲什麼'net_obj'沒有返回id(它應該返回1而不是Null),導致'net_form'被正確地保存到數據庫中。 –

相關問題