删除图像后,我需要将其从文件系统中删除。 我为此使用了信号。 它运作良好,直到我发现一些奇怪的行为。 如果在django admin中我选择另一个文件(所以,我更改图像文件)并同时选择删除图像,然后图像不会从文件系统中删除/看起来django试图删除POST数据中的文件。
有没有办法删除旧文件?
答案 0 :(得分:0)
如果我正确理解您的问题,您需要在Django admin中替换图像时删除旧图像。
对于此,删除信号将无济于事,因为模型实例永远不会被删除,但只更改了一个属性。为此,您需要一种方法来确定模型实例在保存时是否脏(任何字段已更改)。
您可以使用django-dirtyfields执行此操作。
class FooModel(DirtyFieldsMixin, models.Model):
image = models.ImageField(upload_to='...')
...
def changeremove(sender, instance, *args, **kwargs):
if instance.is_dirty():
name = 'image'
new = getattr(instance, name)
old = instance.get_dirty_fields().get(name, None)
if old:
old.delete(save=False)
setattr(instance, name, new)
post_save.connect(changeremove, sender=FooModel)