2011-09-30 34 views
6

下面我有一個自定義的乾淨方法:Django的驗證ImageField的尺寸等

def clean_image(self): 
    image = self.cleaned_data['image'] 
    if image: 
     from django.core.files.images import get_image_dimensions 
     w, h = get_image_dimensions(image) 
     if not image.content_type in settings.VALID_IMAGE_FORMATS: 
      raise forms.ValidationError(u'Only *.gif, *.jpg and *.png images are allowed.') 
     if w > settings.VALID_IMAGE_WIDTH or h > settings.VALID_IMAGE_HEIGHT: 
      raise forms.ValidationError(u'That image is too big. The image needs to be ' + str(settings.VALID_IMAGE_WIDTH) + 'px * ' + str(settings.VALID_IMAGE_HEIGHT) + 'px (or less).') 
     return image 

問題的情形是這樣的:

的圖像已被上傳。我現在想用使用ImageField小部件顯示的複選框清除它。在提交表格時明確表示不發生。

如果我刪除我的自定義清理方法清除確實工作。所以我想我的方法做錯了。

+3

嘗試取消縮進的回報,使其與if語句的直列,即它總是返回數據。 –

回答

0

我認爲它不是從cleaning_data返回圖像。你應該檢查一下,因爲你的編碼看起來很好。

9

有3個問題,當Django認識到這一點的驗證:

  1. 的Django需要獲得這些字段的值,總是需要返回一個值
  2. 需要把類的Meta與您所使用的模型的名稱。
  3. 在這個句子需要把不用彷徨這樣

    self.cleaned_data.get['image'] 
    
  4. 的代碼看起來是這樣的:

    class Meta: 
        model = NameModel  
    
    def clean_image(self): 
        image = self.cleaned_data.get['image'] 
        if image: 
         from django.core.files.images import get_image_dimensions 
         w, h = get_image_dimensions(image) 
         if not image.content_type in settings.VALID_IMAGE_FORMATS: 
          raise forms.ValidationError(u'Only *.gif, *.jpg and *.png images are allowed.') 
         if w > settings.VALID_IMAGE_WIDTH or h > settings.VALID_IMAGE_HEIGHT: 
          raise forms.ValidationError(u'That image is too big. The image needs to be ' +  str(settings.VALID_IMAGE_WIDTH) + 'px * ' + str(settings.VALID_IMAGE_HEIGHT) + 'px (or less).') 
        return image 
    
+0

第1點是這裏的答案 - 您必須確保'clean_image'返回一個值,這允許Django管理員清除功能發生。 – jamesc

+1

直到我將上述內容更改爲'image = self.cleaned_data ['image']' – shacker