2015-04-17 80 views
0

我有一個ModelForm。有幾個字段,如:將值傳遞給不是來自Django中輸入的必填字段ModelForm

['display_from', 'display_to', 'position', 'image'] 

但是,display_from和display_to不在我的模板中。我想重寫驗證並在出現任何驗證錯誤之前將這些字段賦予一些值。我做了這樣的事情:

def clean(self): 
    position = self.cleaned_data.get('position') 
    image = self.cleaned_data.get('image') 

    display_from = "value here" 
    display_to = "value here" 

    self.cleaned_data['display_from'] = display_from 
    self.cleaned_data['display_to'] = display_to 

    return self.cleaned_data 

當我打印的清潔數據,我可以看到在終端的值。但是,當我在頁面上顯示錯誤消息時,它告訴我display_from和display_to是必需的。

也許這不應該在clean()方法中完成?

我試圖使用空的隱藏輸入,但它沒有奏效。有任何想法嗎?

編輯:

剔除領域沒有幫助,它返回一個IntegrityError消息:

null value in column "display_from" violates not-null constraint 
+0

您排除了元中的字段嗎? – karthikr

回答

-1

您將需要這些字段添加到您的exclude元組:

class YourForm(forms.ModelForm): 
    class Meta: 
     exclude = ('display_from', 'display_to',) 
     model = YourModel 

    def clean(self): 
     . . . 

然後你不會得到所需的字段錯誤,並可以根據需要覆蓋驗證。

+0

它給了我一個錯誤消息,我已經嘗試過了:'列中的空值'display_from「違反了非空約束' – lukas

+0

也許是因爲被排除的字段沒有保存在模型實例中?在'乾淨'嘗試設置它們是這樣的:'self.instance.display_from =「value here」'(當然,'self.cleaned_data ['display_from'] = self.instance.display_from') – Pynchia

+0

我發現這個由於Model字段爲空= False,通常無法使用。 –

1

請注意,對於模型上的每個字段(文檔號:here),清潔函數後稱爲

因此,那些單個字段清理函數將引發ValidationErrors,該函數會在您的clean()函數進入之前固定到form.errors字典並將缺省值添加到cleaned_data字典中。

你也可以繼續你已經開始的方法。只要從錯誤字典中刪除錯誤。

def clean(self): 
    del form.errors['display_from'] 
    del form.errors['display_to'] 
    display_from = "value here" 
    display_to = "value here" 

    self.cleaned_data['display_from'] = display_from 
    self.cleaned_data['display_to'] = display_to 

    return self.cleaned_data 

還有其他一些方法。

對於非常簡單的情況,您可以避免在表單中使用隱藏字段。

您也可以重寫clean_方法以返回適當的值。這些生成的值可能會傳遞給ModelForm構造函數:

form = SomeModelForm(request.POST or None, initial={"option": "10"})