2012-06-29 35 views
2

使用Django模型形式,我的models.py收到一個錯誤,而在views.py

class Alert(models.Model): 

    user = models.CharField(max_length=30, blank=True) 
    a = models.IntegerField(blank=True) 
    def __unicode__(self): 
     return "'%s' at %s" % (self.user) 

在我forms.py:

class AlertForm(forms.ModelForm): 
    class Meta: 
     model=Alert 
     fields = ('a','user') 
     widgets = { 
      'user': forms.HiddenInput() 
     } 

AlertCountFormset = modelformset_factory(Alert, 
             form = AlertForm) 

在我views.py:

def profile_setting(request, slug): 
if request.method == 'GET': 
    form = AlertForm(request.POST) 
    if form.is_valid(): 
     alert_form = form.save(commit=False) 
     alert_form.user = request.user.username 
     alert_form.save() # Here i am getting the error 
     return HttpResponseRedirect('/user/list') 

extra_context = { 
    'form': AlertForm() 
} 
return direct_to_template(request,'users/profile_setting.html', 
          extra_context) 

我想填充Django模型窗體,但我得到以下error我在那裏發表評論:

events_alertcount.a may not be NULL 

這是什麼?即使在將null=True置於a的字段中後,也會顯示相同的錯誤。我的forms.py or models.py有什麼問題嗎?

+0

您的視圖代碼片段中還有一個錯誤,並不重要。但是您再次檢查請求GET並從POST收集表單。 –

回答

3

這也在數據庫級別上實施。在數據庫中設置您的「a」列,以允許該字段爲NULL。這應該解決它。 HTH。

+0

我沒有得到你。你問我做這個*** a = models.IntegerField(空=真,空=真)***? –

+1

是的,你必須在'a'上聲明這個。如果您運行的syncdb不爲null = True,您的數據庫將設置字段不接受NULL作爲值。所以你必須改變你的db列以接受NULL值。在將a更改爲a = models之後,您還可以刪除db表並再次運行syncdb。IntegerField(空白=真,空=真)。但是,在刪除表格之前,請先備份它們已經充滿數據的表格。 – Jingo

3

試試這個:

a = models.IntegerField(blank=True, null=True) 

,你應該再次調用執行syncdb

+3

syncdb不會更改現有的數據庫表! – Jingo

2

當定義模型領域,blank選項驗證相關的,也就是說如果你設置blank爲true,驗證不會如果該字段未填寫,則失敗。

blank與驗證相關。如果某個字段有blank=True,則在Django的管理站點上進行驗證將允許輸入一個空值。如果一個字段有blank=False,則該字段將是必需的。

但是,如果驗證沒有失敗並且您保存模型,該字段將被持久保存到數據庫。現在,數據庫中的字段不能爲null,除非將null選項設置爲true。

null純粹與數據庫相關,而空白與驗證相關。

說了這麼多,你可以通過添加null選項修復你錯誤Alert.a

a = models.IntegerField(blank=True, null=True) 

現在,如果你已經跑了syncdb命令,你需要刪除你的表,然後請重新運行syncdb以便接受此更改。如果此數據庫是生產數據庫,並且無法執行此操作,請查看django-south,瞭解如何遷移模式和數據。