首页 > 解决方案 > Django:UpdateView,创建另一个以前的图像

问题描述

如果我更改模板中的某些内容但不是图像字段并将其发送,django 会使用另一个名称创建相同的图像。fe previous_imagename_{random_generated_letters}.jpg... . Django 采用以前的图像名称并创建相同的图像文件,并将一些生成的短代码添加到以前的图像中。

如果在模型中删除 def save() 它正在工作(而不是创建另一个),但我需要在保存到数据库之前更改图像大小。

视图.py

class Edit(UpdateView):
    model = User_data
    form_class = EditProfileFormExtra
    template_name = 'account/edit.html'
    slug_field = "slug"

    def get_success_url(self):
        return reverse('accounts:edit', kwargs={'slug': self.kwargs['slug']})

模型.py

class User_data(models.Model):
    username = models.OneToOneField(User, on_delete = models.CASCADE)
    image = models.ImageField(upload_to = get_upload_path, default='default/profile_photo_default.jpg')
    def save(self,*args, **kwargs):
        if self.image:
            #Opening the uploaded image
            im = Image.open(self.image)

            if im.mode in ("RGBA", "P"): 
                im = im.convert("RGB")

            output = BytesIO()
            w, h = im.size

            #Resize/modify the image
            if w > 1000 or h > 1000:
                d = w//1000 if w >= h else h//1000
            else:
                d = 1

            #Resizing
            im = im.resize((w//d, h//d))

            #after modifications, save it to the output
            im.save(output, format='JPEG', quality=100)
            output.seek(0)

            #change the imagefield value to be the newley modifed image value
            self.image = InMemoryUploadedFile(output,'ImageField', "%s.jpg" %self.image.name.split('.')[0], 'image/jpeg', sys.getsizeof(output), None)

        super(User_data,self).save(*args, **kwargs)

标签: pythondjangofile-upload

解决方案


我遇到了同样的问题,我发现的解决方法是使用django-cleanup

django-cleanup 应用程序自动删除 FileField、ImageField 和子类的文件。当 FileField 的值改变并保存模型时,旧文件将被删除。删除具有 FileField 的模型时,该文件也将被删除。设置为 FileField 的默认值的文件不会被删除。


推荐阅读