2012-08-14 86 views
1

我使用ImageMagick和the binding wand为在Django中上传的图像生成缩略图。我可以生成缩略图,但我不确定如何将图像对象从ImageMagick传回到Django模型。所以我有一个简化模型如下:在Django中处理文件

from wand import Image 

class Attachment(models.Model): 
    attachment = models.FileField(upload_to="some_path") 
    thumbnail = models.ImageField(upload_to="other_path") 

    def generate_thumb(self): 
     with Image(file=self.attachment) as wand: 
      thumb = wand.resize(width=50, height=50) 
      thumb.save(file=self.thumbnail) 

这在ValueError: The 'thumbnail' attribute has no file associated with it.最后一行产生一个错误有没有一种简单的方法来得到一个文件对象了魔杖,进入Django的没有太多的愚蠢?

谢谢。

+0

你如何使用'generate_thumb'函数?代码中可能还有另一个地方引用它。 – sergzach 2012-08-15 15:56:24

回答

5

免责声明:我是Wand的创建者,您正在尝试使用。首先,ImageField需要PIL。这意味着你不需要魔杖,因为你可能已经安装了另一个图像库。不过,我会在没有任何重大改变的情况下回答你的问题

似乎self.thumbnail不是此刻尚未初始化,所以你必须创建一个新的FileImageFile第一:

import io 

def generate_thumb(self): 
    buffer = io.BytesIO() 
    with Image(file=self.attachment) as wand: 
     wand.resize(width=50, height=50) 
     wand.save(file=buffer) 
    buffer.seek(0) 
    self.thumbnail = ImageFile(buffer) 

另外,from wand import Image将提高ImportError。应改为:

from wand.image import Image 
+0

谢谢你,尽管我正在使用ImageFile的PIL版本。大多数人都知道,我应该使用django包装:从django.core.files.images import ImageFile – Zach 2014-10-14 21:16:31