仅当 upload_to 被称为 django 时才调整图像大小
resizing an image only if upload_to was called django
我有以下代码,models.py:
class Location(models.Model):
image_file = models.ImageField(upload_to=upload_to_location, null=True, blank=True)
name = models.CharField(max_length=200)
调用图像重命名的 upload_to
函数。然后我的保存方法
def save(self, *args, **kwargs):
try:
this = Location.objects.get(id=self.id)
if this.image_file:
os.remove(this.image_file.path)
except ObjectDoesNotExist:
pass
super(Location, self).save(*args, **kwargs)
try:
this = Location.objects.get(id=self.id)
if this.image_file:
resize(this.image_file.path)
except ObjectDoesNotExist:
pass
def upload_to_location(instance, filename):
blocks = filename.split('.')
ext = blocks[-1]
filename = "%s.%s" % (instance.name.replace(" ", "-"), ext)
return filename
检查以前上传的文件是否存在,如果存在,则将其删除。然后在保存之后,再次检查文件是否存在,然后调用resize
函数。如果我上传一个文件并单击保存,那行得通。但是,如果我只更改位置的名称,则会调用 os.remove
函数,删除我的文件,然后 resize
函数会报错。
因此我只想在用户上传时调用 os.remove
函数, upload_to
将被调用。
所以我尝试了几件事,但无法完成。我还尝试了 pre_save
和 post_save
信号。因此,我在获取图像路径时遇到了问题:
@receiver(pre_save, sender=Company)
def my_function2(sender, instance, **kwargs):
print instance.path #didn't work
print os.path.realpath(instance) #didn't work
有谁知道我如何用 pre_save
或其他方法解决这个问题?
如果您只想在调用 upload_to
时调用 os.remove
,为什么不将该代码移到 upload_to_location
函数中?
def upload_to_location(self, filename):
try:
this = Location.objects.get(id=self.id)
if this.image_file:
os.remove(this.image_file.path)
except ObjectDoesNotExist:
pass
# do something else...
这样,调用upload_to
时,会调用os.remove
。
额外内容
无需调用 os.remove
来删除关联文件,您可以通过调用该文件字段的 delete()
方法来删除文件。
if this.image_file:
this.image_file.delete(save=True)
save=True
删除文件后保存this
实例。如果您不想那样,请传递 save=False
。默认为 True
.
而在函数 my_function2
中,您正在收听信号的地方应该是:
instance.image_file.path
我有以下代码,models.py:
class Location(models.Model):
image_file = models.ImageField(upload_to=upload_to_location, null=True, blank=True)
name = models.CharField(max_length=200)
调用图像重命名的 upload_to
函数。然后我的保存方法
def save(self, *args, **kwargs):
try:
this = Location.objects.get(id=self.id)
if this.image_file:
os.remove(this.image_file.path)
except ObjectDoesNotExist:
pass
super(Location, self).save(*args, **kwargs)
try:
this = Location.objects.get(id=self.id)
if this.image_file:
resize(this.image_file.path)
except ObjectDoesNotExist:
pass
def upload_to_location(instance, filename):
blocks = filename.split('.')
ext = blocks[-1]
filename = "%s.%s" % (instance.name.replace(" ", "-"), ext)
return filename
检查以前上传的文件是否存在,如果存在,则将其删除。然后在保存之后,再次检查文件是否存在,然后调用resize
函数。如果我上传一个文件并单击保存,那行得通。但是,如果我只更改位置的名称,则会调用 os.remove
函数,删除我的文件,然后 resize
函数会报错。
因此我只想在用户上传时调用 os.remove
函数, upload_to
将被调用。
所以我尝试了几件事,但无法完成。我还尝试了 pre_save
和 post_save
信号。因此,我在获取图像路径时遇到了问题:
@receiver(pre_save, sender=Company)
def my_function2(sender, instance, **kwargs):
print instance.path #didn't work
print os.path.realpath(instance) #didn't work
有谁知道我如何用 pre_save
或其他方法解决这个问题?
如果您只想在调用 upload_to
时调用 os.remove
,为什么不将该代码移到 upload_to_location
函数中?
def upload_to_location(self, filename):
try:
this = Location.objects.get(id=self.id)
if this.image_file:
os.remove(this.image_file.path)
except ObjectDoesNotExist:
pass
# do something else...
这样,调用upload_to
时,会调用os.remove
。
额外内容
无需调用 os.remove
来删除关联文件,您可以通过调用该文件字段的 delete()
方法来删除文件。
if this.image_file:
this.image_file.delete(save=True)
save=True
删除文件后保存this
实例。如果您不想那样,请传递 save=False
。默认为 True
.
而在函数 my_function2
中,您正在收听信号的地方应该是:
instance.image_file.path