2011-10-25 65 views
10

下面的代碼需要它被保存後的圖像,使縮略圖出來的:Django的 - 手動保存圖像到的ImageField場

class Image(models.Model): 
    image  = models.ImageField(upload_to='images') 
    thumbnail = models.ImageField(upload_to='images/thumbnails', editable=False) 

    def save(self, *args, **kwargs): 
     super(Image, self).save(*args, **kwargs) 
     if self.image: 
      from PIL import Image as ImageObj 
      from cStringIO import StringIO 
      from django.core.files.uploadedfile import SimpleUploadedFile 

      try: 
       # thumbnail 
       THUMBNAIL_SIZE = (160, 160) # dimensions 

       image = ImageObj.open(self.image) 

       # Convert to RGB if necessary 
       if image.mode not in ('L', 'RGB'): image = image.convert('RGB') 

       # create a thumbnail + use antialiasing for a smoother thumbnail 
       image.thumbnail(THUMBNAIL_SIZE, ImageObj.ANTIALIAS) 

       # fetch image into memory 
       temp_handle = StringIO() 
       image.save(temp_handle, 'png') 
       temp_handle.seek(0) 

       # save it 
       file_name, file_ext = os.path.splitext(self.image.name.rpartition('/')[-1]) 
       suf = SimpleUploadedFile(file_name + file_ext, temp_handle.read(), content_type='image/png') 

       self.thumbnail.save(file_name + '.png', suf, save=False) 
      except ImportError: 
       pass 

它的正常工作,原始圖像+縮略圖都被上傳,圖像被分配正確的路徑。

唯一的問題是縮略圖沒有被分配新創建的縮略圖的路徑 - 它在數據庫中是空的。我已閱讀文檔,它看起來像如果我保存保存縮略圖=真應該解決我的問題:

self.thumbnail.save(file_name + '.png', suf, save=True) 

但是,這樣做是提高以下幾點:

Django Version: 1.3.1 
Exception Type: IOError 
Exception Value:  
cannot identify image file 

我可以弄清楚我做錯了什麼。

回答

6

我已經通過移動簡單地解決我的問題:

super(Image, self).save(*args, **kwargs) 

到def save()結束。我仍然不確定爲什麼會發生這種情況,但我唯一的解釋是save()本身是將字段值保存到數據庫中,因此它需要在最後執行。

2

嘗試通過實際的文件內容,而不是SimpleUploadedFile對象:

self.thumbnail.save(file_name + '.png', temp_handle.read(), save=True) 

https://docs.djangoproject.com/en/dev/ref/files/file/#additional-methods-on-files-attached-to-objects how to manually assign imagefield in Django Programmatically saving image to Django ImageField

+0

我已經試過了,它給出了以下錯誤: 異常類型:\t AttributeError 異常值:'str'對象沒有屬性'chunks' – abstractpaper

相關問題