У меня есть страница профиля пользователя с изображением профиля на основе ImageField в моей модели. Когда я отправляю форму и загружаю новое изображение, исходный файл изображения не удаляется из /static/images/. Как я могу удалить старое изображение профиля из папки с изображениями после загрузки нового изображения?
Как удалить старое изображение профиля при загрузке нового - Django
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
Выглядит очень хорошо, но эффективно ли?
- person Rares D; 29.06.2020
Пожалуйста, объясните мне эту часть: если instance._state.adding, а не istance.pk: вернуть False, что он делает?
- person Rares D; 29.06.2020
@RaresD так же эффективен, как и обычные функции Python, поскольку сигналы выполняются синхронно.
- person minglyu; 29.06.2020
@RaresD При создании объекта у экземпляра еще нет pk, поэтому мы используем
not instance.pk
, чтобы определить, создан он или нет. подробнее здесь предварительная проверка сигнала сохранения, если экземпляр создан, не обновляется kwargsc">stackoverflow.com/questions/3607573/
- person minglyu; 29.06.2020
Спасибо! Теперь я понимаю!
- person Rares D; 29.06.2020