Как удалить старое изображение профиля при загрузке нового - Django

У меня есть страница профиля пользователя с изображением профиля на основе ImageField в моей модели. Когда я отправляю форму и загружаю новое изображение, исходный файл изображения не удаляется из /static/images/. Как я могу удалить старое изображение профиля из папки с изображениями после загрузки нового изображения?


person Rares D    schedule 29.06.2020    source источник
comment
Вы перезаписываете тот же файл или создаете новый файл?   -  person Moosa Saadat    schedule 29.06.2020
comment
Теперь, когда я загружаю новую фотографию, создается новый файл. Я хочу удалить старый файл после загрузки нового.   -  person Rares D    schedule 29.06.2020
comment
Проще всего перезаписать тот же файл. Таким образом, он будет автоматически удален. Но для другого метода, пожалуйста, поделитесь своим кодом, чтобы кто-нибудь мог помочь.   -  person Moosa Saadat    schedule 29.06.2020
comment
хорошо, перезаписать тот же файл звучит хорошо, но как я могу это сделать? Какую часть кода вы хотите увидеть?   -  person Rares D    schedule 29.06.2020


Ответы (1)


Вы можете использовать pre_save сигнал, чтобы удалить старый файл перед сохранением нового файла

from django.db.models.signals import pre_save
import os

@receiver(pre_save, sender=ImageModel)
def delete_old_file(sender, instance, **kwargs):
    # on creation, signal callback won't be triggered 
    if instance._state.adding and not istance.pk:
        return False
    
    try:
        old_file = sender.objects.get(pk=instance.pk).file
    except sender.DoesNotExist:
        return False
    
    # comparing the new file with the old one
    file = instance.file
    if not old_file == file:
        if os.path.isfile(old_file.path):
            os.remove(old_file.path)
person minglyu    schedule 29.06.2020
comment
Выглядит очень хорошо, но эффективно ли? - person Rares D; 29.06.2020
comment
Пожалуйста, объясните мне эту часть: если instance._state.adding, а не istance.pk: вернуть False, что он делает? - person Rares D; 29.06.2020
comment
@RaresD так же эффективен, как и обычные функции Python, поскольку сигналы выполняются синхронно. - person minglyu; 29.06.2020
comment
@RaresD При создании объекта у экземпляра еще нет pk, поэтому мы используем not instance.pk, чтобы определить, создан он или нет. подробнее здесь предварительная проверка сигнала сохранения, если экземпляр создан, не обновляется kwargsc">stackoverflow.com/questions/3607573/ - person minglyu; 29.06.2020
comment
Спасибо! Теперь я понимаю! - person Rares D; 29.06.2020