python - 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)
解决方案
我遇到了同样的问题,我发现的解决方法是使用django-cleanup
django-cleanup 应用程序自动删除 FileField、ImageField 和子类的文件。当 FileField 的值改变并保存模型时,旧文件将被删除。删除具有 FileField 的模型时,该文件也将被删除。设置为 FileField 的默认值的文件不会被删除。
推荐阅读
- android - 如何在android中为recycler view实现跳转动画(遵循材料设计)
- mysql - 通过过程将外键插入表中不影响
- search - 带有引号和多个逗号的 CSV 文件的 Solr 模式/索引
- javascript - 数组 setState 和获取数组 React Native
- angularjs - AngularJS 指令找不到所需的控制器
- svg - 为什么 xlink 与 svg 一起使用,而不是仅使用图像标签?
- amazon-web-services - AWS Api Gateway 使用消息属性连接到 SQS
- sql - 将数据从一个表复制到另一个 postgresql
- django - Django admin - 在列表显示中同时编辑多个值
- angular - Angular创建空模型