- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一种在保存 ImageField 时调整大小、压缩和优化上传图像的方法。
class Image(models.Model):
name = models.CharField(max_length=254, blank=True)
caption = models.TextField(max_length=1000, blank=True)
height = models.IntegerField()
width = models.IntegerField()
image = models.ImageField(upload_to='', height_field='height', width_field='width', storage=S3MediaStorage())
我的第一个想法是覆盖模型的 save()
并在那里实现这个逻辑,但我不希望在用户不更新时再次运行调整大小/压缩/优化图像文件(即,如果他只更新现有对象的 name
或 caption
并保存它)。
什么是检查新图像文件何时上传到 ImageField 的正确方法,而不是当用户仅更改模型中的另一个字段时,例如。用户更新了 caption
但其他一切保持原样?
如何在代码中访问上传的图像文件? IE。包含可以传递给 Pillow 的实际图像文件的变量是什么?
编辑:这在 the suspected duplicate 中是独一无二的.我不是在问这个领域是否已经改变,因为那总是会导致误报。我问用户是否上传了一个图像文件,我会立即更改(调整大小/优化/压缩),所以如果用户立即下载他上传的图像,他会发现它有一个不同的二进制文件和随机生成的文件名,并且因此,比较文件名或二进制文件不是确定用户是否上传不同图像的有效方法。
最佳答案
您的模型可以使用不同的名称。
不过,您可以尝试通过 post_save 信号 ( https://docs.djangoproject.com/en/1.9/ref/signals/#post-save ) 操纵图像
from PIL import Image
from django.db.models.signals import post_save
@receiver(post_save, sender=Image)
def crop_image(sender, instance, **kwargs):
img = instance.image
original = Image.open(img.src.path)
# ... your code here...
编辑:抱歉。稍微跳了枪。您的实际问题之一是如果图像相同则不要对其进行操作。您可以像这样在 save()
上执行此操作(未测试):
def save(self, **kwargs):
try:
related_img = Image.objects.get(id=self.id)
if related_img.image != self.image:
crop_me(self.image)
except Image.DoesNotExist:
# object doesn't exist. Passing...
pass
return super(Image, self).save(**kwargs)
def crop_me(img):
original_img = Image.open(img.src.path)
# ... your code here...
编辑 2:如果名称更改,您可以将原始文件名保存在辅助字段中
class Image(models.Model):
image = models.ImageField(upload_to='', height_field='height', width_field='width', storage=S3MediaStorage())
__original_image_filename = None
def __init__(self, *args, **kwargs):
super(Image, self).__init__(*args, **kwargs)
self.__original_image_filename = self.image.name
def save(self, force_insert=False, force_update=False, *args, **kwargs):
if self.image.name != self.__original_image_filename:
# name changed - do something here
super(Image, self).save(force_insert, force_update, *args, **kwargs)
self.__original_image_filename = self.image.name
我正在即时修改另一个答案,因此可能会出现一两个错误。请查看the original answer .关于这个问题还有其他方法可以帮助您。
关于Django 如何在使用 ImageField 保存模型时检查用户是否上传了图像文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36133243/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!