2011-03-23 37 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