成功实现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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Django中生成收集的图片的缩略图,可以使用Pillow库。以下是一个简单的示例代码: ```python from PIL import Image from django.conf import settings from django.core.files.storage import default_storage from django.core.files.base import ContentFile def generate_thumbnail(image_path, thumbnail_path, thumbnail_size): with default_storage.open(image_path, 'rb') as f: with Image.open(f) as im: im.thumbnail(thumbnail_size) with default_storage.open(thumbnail_path, 'wb') as tf: im.save(tf, 'JPEG') def save_model(instance, force_insert=False, force_update=False, using=None, update_fields=None): # 保存模型前的处理 super().save(force_insert, force_update, using, update_fields) # 生成缩略图 image_path = instance.image.name if image_path: thumbnail_path = '%s_thumbnail.jpg' % (instance.image.name,) thumbnail_size = (100, 100) generate_thumbnail(image_path, thumbnail_path, thumbnail_size) ``` 在上述代码中,我们定义了一个generate_thumbnail函数,用于生成缩略图。该函数接受三个参数:原始图片的路径、缩略图的路径、缩略图的大小。 同时,我们也定义了一个save_model方法,在保存模型时会自动调用该方法。在该方法中,我们调用了generate_thumbnail函数生成缩略图,并将其保存到默认存储中。 需要注意的是,我们在生成缩略图的路径中添加了_thumbnail的后缀,以避免与原始图片的文件名冲突。同时,我们在生成缩略图时也可以根据需要调整缩略图的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值