使用ImageField保存图像后修改图像

时间:2013-06-04 04:37:14

标签: django django-models

我完全迷失了如何在保存后修改图像。我有一个模特:

class Pic(models.Model):
    imgfile = FaceChopField(upload_to='img/%m/%d')

图片上传得很好。我已经把这个问题看了一堆,我发现了一些片段和类似的问题,但我仍然非常困惑。是的,我已经对这种确切的混淆/问题进行了大量搜索。

我有什么方法可以:

  1. 访问已保存的图像目录。
  2. 找到按名称/目录上传的图片。
  3. 在图片上运行我的modify_image(filename)。
  4. 将修改后的图像保存在其他目录中。
  5. 我已经阅读了Django网站上有关管理文件的文档,我已经仔细研究了StackOverflow,尝试了不同的解决方案。我所要求的只是对上述内容采取直截了当的方法。如果太麻烦你甚至不需要给我看任何代码。我只是不知所措,我不知道我现在在做什么,所以解决方案的一些算法布局会很棒。谢谢。


    这是我目前的尝试:

    class FaceChopFieldFile(ImageFieldFile):
        def __init__(self, *args, **kwargs):
            super(FaceChopFieldFile, self).__init__(*args, **kwargs)
    
        def save(self):
            super(FaceChopFieldFile, self).save()
            image_content = facechop(self.path) #my image modification function
    
            self.storage.save(self.path, image_content)
    
    
    class FaceChopField(ImageField):
        attr_class = FaceChopFieldFile    
    
    
    class Pic(models.Model): 
        imgfile =  FaceChopField(upload_to='img/%m/%d')
    

    有什么不对吗?

2 个答案:

答案 0 :(得分:0)

您真正需要的是当一个对象即将保存到DB时调用的 hook 。我要做的是让所有图像处理逻辑都在覆盖模型save method 的函数中。但是,这会降低您网站的用户体验。在那种情况下,我建议写celery task。更好的是,您可以运行periodic task

答案 1 :(得分:0)

我已经解决了自己的问题。原来我错误地覆盖了save():

class FaceChopFieldFile(ImageFieldFile):
    def __init__(self, *args, **kwargs):
        super(FaceChopFieldFile, self).__init__(*args, **kwargs)

    def save(self, name, content, save=True):
        super(FaceChopFieldFile, self).save(name, content, save)
        image_content = facechop(self.path) #my image modification function

        self.storage.save(self.path, image_content)


class FaceChopField(ImageField):
    attr_class = FaceChopFieldFile



class Pic(models.Model): 
    imgfile =  FaceChopField(upload_to='img/%m/%d')

问题是:

def save(self):
    super(FaceChopFieldFile, self).save()

所以我将其更改为:

def save(self, name, content, save=True):
            super(FaceChopFieldFile, self).save(name, content, save)

它完全符合我现在的要求。