Это нормальное поведение, потому что экземпляры post
хранят только путь к файлу , как строку, а не фактический файл. Фактический файл хранится в файловой системе .
Чтобы удалить фактический файл после удаления экземпляра post
, у вас есть несколько вариантов:
1. Переопределите функцию delete
например
def delete(self, using=None, keep_parents=False):
self.image.delete()
super().delete()
2. Добавить сигнал удаления сообщения Хотя в использовании сигналов нет ничего плохого, вы должны учитывать две особенности:
- Сигнал может отправляться несколько раз за одно действие, поэтому вы должен обрабатывать любой код, который может вызвать ошибки, если он запускается более одного раза на одном экземпляре (например, при попытке удалить несуществующий файл)
try:
os.remove(filename)
except OSError:
pass
Поскольку сигнал не входит в ожидаемый поток кода
, при наличии ошибки может быть сложно отследить его для менее опытных разработчиков
3. Используйте пакет, такой как django -cleanup