2012-05-27 55 views
2

我通過tutorial如何擡起負荷影像工作我的方式生成用戶提交的圖像的縮略圖,我在對方法這傢伙用它來生成縮略圖完全喪失提交照片通過遞歸調用模型

這裏是他的代碼下調大塊:

import os.path 
from PIL import Image as PImage 
from settings import MEDIA_ROOT 
from tempfile import * 

class Image(models.Model): 
    image = models.FileField(upload_to="images/") 
    thumbnail = models.ImageField(upload_to="images/", blank=True, null=True) 

    def save(self, *args, **kwargs): 
     super(Image, self).save(*args, **kwargs) 
     im = PImage.open(pjoin(MEDIA_ROOT, self.image.name)) 

     fn, ext = os.path.splitext(self.image.name) 
     im.thumbnail((128,128), PImage.ANTIALIAS) 
     thumb_fn = fn + "-thumb" + ext 
     tf = NamedTemporaryFile() 
     im.save(tf.name, "JPEG") 
     self.thumbnail.save(thumb_fn, File(open(tf.name)), save=False) 
     tf.close() 

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

所以我對這個具體的問題是:

  1. 他爲圖像和ImageField使用FileField作爲縮略圖的任何原因?
  2. 據我所知,super(Image, self).save(*args, **kwargs)保存模型。但爲什麼他最後再打電話呢?
  3. 然後,我真的不明白的角色扮演NamedTemporaryFile(),什麼時候self.thumbnail.save(thumb_fn, File(open(tf.name)), save=False)

回答

2
  1. 我會用ImageField的主形象,以及到底會發生。 ImageField的 繼承的FileField但確保只有圖像文件可以 上傳,其中包括: https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ImageField

  2. 首先save()保存圖像對象數據庫,但它(據說)沒有縮略圖被設定。第二個save()調用通過對實例所做的更改(添加了縮略圖)來更新數據庫。

    他設置縮略圖場 self.thumbnail.save(thumb_fn, File(open(tf.name)), save=False), 但不僅節省了縮略圖可在適當位置的文件,並在該實例的thumbnail ATTR與路徑它填補。然後您需要再次調用Image實例上的save()以將對象上的更改更新爲數據庫(添加了縮略圖)。

  3. 的代碼讀取上傳主圖像文件和與存儲器中該圖像從構成它的縮略圖(在存儲器中,它不存在作爲文件尚未)。

    但是縮略圖需要被保存在一個文件中,以便它可以使用Django ImageFile(即預計暫時保存在磁盤上上傳的文件)使用,這是他與NamedTemporaryFile做。然後

    ImageFile實例負責複製該文件到合適的位置(設置你的MEDIA_ROOT設置+的upload_to參數)。

+0

確定冷靜,感謝羚牛的時間來解釋 – Ben