2014-01-17 2 views
0

Я удаляю связанную модель из формы (почти так же, как администратор django), у меня есть элемент, который имеет много изображений, изображение принадлежит Item (ForeignKey). я реализовал post_delete сигнал для удаления эскизов и изображение при удалении изображения/изображения из формы, проблема заключается в том, что в post_delete миниатюры будут удалены, но запись изображения в БД остается:Django easy_thumbnails and post_delete

# Auto-delete files from filesystem when they are unneeded: 
@receiver(models.signals.post_delete, sender=ImageModel) 
def auto_delete_file_on_delete(sender, instance, **kwargs): 
    """Deletes file from filesystem 
    when corresponding `ImageModel` object is deleted. 
    """ 
    if instance.imagefile: 
     thumbmanager = get_thumbnailer(instance.imagefile) 
     thumbmanager.delete() 

Если добавить следующее в конце концов, экземпляр изображения также удаляется (ожидаемое поведение):

# Auto-delete files from filesystem when they are unneeded: 
@receiver(models.signals.post_delete, sender=ImageModel) 
def auto_delete_file_on_delete(sender, instance, **kwargs): 
    """Deletes file from filesystem 
    when corresponding `ImageModel` object is deleted. 
    """ 
    if instance.imagefile: 
     thumbmanager = get_thumbnailer(instance.imagefile) 
     thumbmanager.delete() 
     instance.delete() 

я упускаю что-то? Не следует ли отправлять post_delete сигнал после удаления экземпляра? Почему экземпляр сохраняется в db? Я предполагаю, что это связано с поведением Queryset delete, но я скептически отношусь к нему, так как если я удалю сигнал, то экземпляр ImageModel будет удален (хотя эскизы остаются в базе данных). вид, что модель использует Джанго построить в поле Imagefield, а не просто эскизы предоставляемых поля:

class ImageModel(models.Model): 
    ... 
    imagefile = models.ImageField(upload_to="properties/%m/%Y") 
    item = models.ForeignKey('app.ItemModel', related_name='images') 
    ... 

выше решение (instance.delete()) работает без проблем, просто любопытствующих о поведении.

ответ

0

Ok получил это работает с добавлением удалить (сохранить = False):

# These two auto-delete files from filesystem when they are unneeded: 
@receiver(models.signals.post_delete, sender=ImageModel) 
def auto_delete_file_on_delete(sender, instance, **kwargs): 
    """Deletes file from filesystem 
    when corresponding `ImageModel` object is deleted. 
    """ 
    if instance.imagefile: 
     thumbmanager = get_thumbnailer(instance.imagefile) 
     thumbmanager.delete(save=False) 
1

Вы также можете использовать django-cleanup, он автоматически вызывает метод удаления на FileField при удалении модели.

pip install django-cleanup 

settings.py

INSTALLED_APPS = (
    ... 
    'django_cleanup', # should go after your apps 
) 
+0

может быть очень рискованным, потому что, как они сказали, что в доке ... 'Джанго-очистка соединяет post_init, pre_save, post_save и post_delete сигналы к сигналу обработчиков для каждой модели который имеет FileField' – andi

Смежные вопросы