2011-03-23 46 views
0

我喜歡最後存放前要調整上傳的圖片(ImageField的)使用PIL,聽說蟒蛇有一個名爲PIL圖像庫,我想用它做的任務,但我不知道如何開始。如何在Django模型

關於如何做到這一點有什麼建議?

感謝

回答

0

您可以覆蓋模型的保存功能,您可以打開文件,並調整其大小(不推薦,因爲它會每次保存模型調整它的大小),你文件上傳後的大小調整(例如,前/ form.save期間())

但恕我直言一個更好的解決方案是使用專門的應用對於這一點,我最喜歡的是sorl-thumbnails

+0

謝謝,我會看在SORL-縮略圖 – ginad 2011-03-23 07:42:56

0

我剛剛找到了如何做到這一點,但有什麼辦法簡化它?我是python和django中的新成員,所以我不確定這是否是正確的方式。

下面

是我的代碼:

from django.db.models.signals import pre_delete, pre_save 

def on_save_image(sender, **kwargs): 
    import PIL 
    obj = kwargs['instance'] 
    if obj.file: 
     try: 
      original = sender.objects.get(pk = obj.pk) 
      if original.file: 
       #if change image then delete original file 
       original.file.delete() 
     except ObjectDoesNotExist: 
      pass 
     finally: 
      img = PIL.Image.open(obj.file) 
      img.thumbnail((500, 500)) 
      # reset pointer to start at 0 again 
      obj.file.open() 
      img.save(obj.file) 
pre_save.connect(on_save_image, sender = Image) 

# delete file in memory 
def on_delete_image(sender, **kwargs): 
    obj = kwargs['instance'] 
    if obj.file: 
     obj.file.delete() 
pre_delete.connect(on_delete_image, sender = Image) 

感謝

+1

等一下,你刪除一個文件,然後試圖打開它? :)和第二..它是壞主意,捕獲所有異常,如果你想趕上的東西 - – Jerzyk 2011-03-23 08:31:56

+0

我使用Django 1.3 RC1和什麼鋸抓具體的事情是,如果你改變圖像不會刪除原來的上傳的圖像,這就是爲什麼我在上傳新記錄之前手動查詢和刪除圖像的原因。我使用obj.file.open重置指針(與seek(0)類似),因爲當我試圖刪除此語句時,它不保存文件。我還在學習django和python,這就是爲什麼我不確定是否有更好的方法來做到這一點。 @Jerzyk對如何簡化代碼有一些建議嗎?由於 – ginad 2011-03-24 02:42:10

+0

正如我以前使用外部庫https://github.com/sorl/sorl-thumbnail/tree/master/sorl/thumbnail或https://github.com/SmileyChris/easy-thumbnails告訴你(最後一個例如:class Profile(models.Model): avatar = ThumbnailerImageField( upload_to ='avatars', resize_source = dict(size =(50,50),crop ='smart'), ) – Jerzyk 2011-03-24 07:20:48