0

我完全不知道如何在保存图像后对其进行修改。我有一个模型:

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

图片上传就好了。我查了很多这个问题,发现了一些片段和类似的问题,但我仍然非常困惑。是的,我已经就这种确切的混淆/问题进行了一系列搜索。

有什么办法我可以:

  1. 访问保存的图像目录。
  2. 找到按名称/目录上传的图像。
  3. 在图像上运行我的 modify_image(filename)。
  4. 将修改后的图像保存在其他目录中。

我已经阅读了 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')

哪里不对了?

4

2 回答 2

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)

它做的正是我现在想要做的。

于 2013-06-05T02:40:58.613 回答
0

你真正需要的是当一个对象即将被保存到数据库时调用的钩子。我要做的是在覆盖模型的保存方法的函数中拥有所有图像处理逻辑。但是,这会减慢您网站的用户体验。在这种情况下,我建议编写celery task。更好的是,您可以运行定期任务

于 2013-06-04T06:15:41.297 回答