2012-10-09 98 views
6

試圖立即解決一個有趣的問題。Django ModelForm驗證

我有一個不需要的image字段的Django模型,但在創建新模型實例時設置爲默認值。

class Product(models.Model): 
    image = models.ImageField(upload_to='/image/directory/', default='/default/image/path/', blank=True) 

我也有基於該模型,包含image領域的ModelForm,並具有一定的自定義驗證。

class ProductForm(forms.ModelForm): 
    class Meta: 
     model = Product 
     fields = ('image',) 

    def clean_image(self): 
     image = self.cleaned_data.get('image', False) 
     if image: 
      # validate image 
     return None 

的問題是,per the docs,在ModelForm調用is_valid()觸發除了模型驗證,形成驗證,所以當用戶提交雛型沒有圖像,我的自定義表單驗證代碼試圖驗證默認模型形象,而不是像它應該做的那樣不做任何事情。

除非表單本身具有image字段的值,否則我怎樣才能讓它不做任何事情?

+0

'blank = True'是數據庫級別的驗證,'null = True'是模型級別的驗證,因此您還需要添加'null = True'。 – karthikr

+3

@karthikr:這不是事實。 null與數據庫相關,而空白與驗證相關。如果一個字段的值爲空,則表單驗證將允許輸入一個空值。如果一個字段有空白= False,該字段將是必需的。 [更多信息](https://docs.djangoproject.com/en/dev/ref/models/fields/#blanko) –

+2

@karthikr我想你可能想仔細檢查一下。從文檔'null是純數據庫相關的,而空白是與驗證相關的。「https://docs.djangoproject.com/en/dev/ref/models/fields/#field-options –

回答

10

剛剛解決它在非常簡單的方式。在這裏添加答案,以防其他人有所幫助。

The Django docs state that

...綁定到一個模型對象將包含一個self.instance屬性,讓模型形式方法訪問特定模型實例模型的形式實例。

因此,而不是檢查ModelForm有一個形象的價值,我只是檢查圖像值是否已經從保存的實例變化。表單驗證現在看起來像這樣:

class ProductForm(forms.ModelForm): 
    class Meta: 
     model = Product 
     fields = ('image',) 

    def clean_image(self): 
     image = self.cleaned_data.get('image', False) 
     if not self.instance.image == image: 
      # validate image 
     return None 

問題解決!

相關問題