1. 程式人生 > >成功實現Django Admin圖片上傳與縮圖處理

成功實現Django Admin圖片上傳與縮圖處理

經過一天的努力,終於實現了完全用Django的方式上傳圖片,並且可自動生成縮圖。過程是很鬱悶的,因為網上搜索到的東西大都不完全。只是給點明一下。比較全面點的參考文章是http://imtx.me/archives/693.html。不過按照這上面說的,做完後會提示錯誤,如下:

IOError: [Errno 2] No such file or directory: '/Users/username/tests/upload/test.jpg' #後面的連結是上傳的圖片路徑

也許是我的操作與作者的解說有不同。不過按照下面的方法可以比較清析的實現目的。還是貼程式碼吧。

首先,在自己建立的專案檔案(models.py)中新增如下程式碼:

from __future__ import division
import os
import Image
from mysite.settings import MEDIA_ROOT
from django.db.models.fields.files import ImageFieldFile

def make_thumb(path, size = 480):
    pixbuf = Image.open(path)
    width, height = pixbuf.size

    if width > size:
        delta = width / size
        height = int(height / delta)
        pixbuf.thumbnail((size, height), Image.ANTIALIAS)

        return pixbuf
class Media(models.Model):
    title = models.CharField(max_length = 120)
    image = models.ImageField(upload_to = 'upload/')
    thumb = models.ImageField(upload_to = 'upload/thumb', blank = True)
    date = models.DateTimeField(auto_now_add = True)

    def save(self):
        super(Media, self).save() #將上傳的圖片先儲存一下,否則報錯
        base, ext = os.path.splitext(os.path.basename(self.image.path))
        thumb_pixbuf = make_thumb(os.path.join(MEDIA_ROOT, self.image.name))
        relate_thumb_path = os.path.join(THUMB_ROOT, base + '.thumb' + ext)
        thumb_path = os.path.join(MEDIA_ROOT, relate_thumb_path)
        thumb_pixbuf.save(thumb_path)
        self.thumb = ImageFieldFile(self, self.thumb, relate_thumb_path)
        super(Media, self).save() #再儲存一下,包括縮圖等

    def __unicode__(self):
        return self.title

模型階段的處理就完成了,接下來編輯同一專案下的admin.py檔案。新增程式碼如下:

class MediaAdmin(admin.ModelAdmin): #這個是為了美觀,防止意外,也可以不要
    readonly_fields = ('thumb',) #因為不需要在後臺修改該項,所以設定為只讀
    def get_readonly_fields(self, request, obj=None):
        if obj: # editing an existing object
           return self.readonly_fields
        return self.readonly_fields

admin.site.register(Media, MediaAdmin)

經過上面的處理,圖片的上傳與縮圖處理都可同時完成。還是先看下我的效果圖:

2013-07-197