我喜欢最后存放前要调整上传的图片(ImageField的)使用PIL,听说蟒蛇有一个名为PIL图像库,我想用它做的任务,但我不知道如何开始。如何在Django模型
关于如何做到这一点有什么建议?
感谢
我喜欢最后存放前要调整上传的图片(ImageField的)使用PIL,听说蟒蛇有一个名为PIL图像库,我想用它做的任务,但我不知道如何开始。如何在Django模型
关于如何做到这一点有什么建议?
感谢
您可以覆盖模型的保存功能,您可以打开文件,并调整其大小(不推荐,因为它会每次保存模型调整它的大小),你文件上传后的大小调整(例如,前/ form.save期间())
但恕我直言一个更好的解决方案是使用专门的应用对于这一点,我最喜欢的是sorl-thumbnails
我刚刚找到了如何做到这一点,但有什么办法简化它?我是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)
感谢
等一下,你删除一个文件,然后试图打开它? :)和第二..它是坏主意,捕获所有异常,如果你想赶上的东西 - – Jerzyk 2011-03-23 08:31:56
我使用Django 1.3 RC1和什么锯抓具体的事情是,如果你改变图像不会删除原来的上传的图像,这就是为什么我在上传新记录之前手动查询和删除图像的原因。我使用obj.file.open重置指针(与seek(0)类似),因为当我试图删除此语句时,它不保存文件。我还在学习django和python,这就是为什么我不确定是否有更好的方法来做到这一点。 @Jerzyk对如何简化代码有一些建议吗?由于 – ginad 2011-03-24 02:42:10
正如我以前使用外部库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
谢谢,我会看在SORL-缩略图 – ginad 2011-03-23 07:42:56