В django после удаления сообщений изображения сообщений все еще находятся в каталоге - PullRequest
0 голосов
/ 03 февраля 2020

В django мои сообщения удалены, а файлы - нет. У меня есть поле изображения в модели, которое я хочу удалить, когда автор удаляет его. Я использую виды, основанные на классах, и удалите. Поэтому, когда я удаляю сообщение, сообщения удаляются, но изображение не удаляется из каталога. Я пытался во многих отношениях, но это не работает. мои модели. поэтому аргумент delete (self) не работает.

Ответы [ 3 ]

0 голосов
/ 03 февраля 2020

Вы можете использовать post_delete сигнал.

В ваших models.py:

from django.db.models.signals import post_delete

@receiver(post_delete, sender=post)
def photo_post_delete_handler(sender, **kwargs):
    photo = kwargs['instance']
    if photo.image:
        storage, path = photo.image.storage, photo.image.path
        storage.delete(path)
0 голосов
/ 03 февраля 2020

Это нормальное поведение, потому что экземпляры post хранят только путь к файлу , как строку, а не фактический файл. Фактический файл хранится в файловой системе .

Чтобы удалить фактический файл после удаления экземпляра post, у вас есть несколько вариантов:

1. Переопределите функцию delete например

def delete(self, using=None, keep_parents=False):
    self.image.delete()
    super().delete()

2. Добавить сигнал удаления сообщения Хотя в использовании сигналов нет ничего плохого, вы должны учитывать две особенности:

  1. Сигнал может отправляться несколько раз за одно действие, поэтому вы должен обрабатывать любой код, который может вызвать ошибки, если он запускается более одного раза на одном экземпляре (например, при попытке удалить несуществующий файл)
try:
    os.remove(filename)
except OSError:
    pass
Поскольку сигнал не входит в ожидаемый поток кода , при наличии ошибки может быть сложно отследить его для менее опытных разработчиков

3. Используйте пакет, такой как django -cleanup

0 голосов
/ 03 февраля 2020

Вы можете попробовать это:

 def delete(self, using=None):
    os.unlink(self.image.path)
    super(post,self).delete()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...