Je suis à l'aide 1.2.5 avec un standard ImageField et à l'aide de l'intégré dans le backend de stockage. De téléchargement de fichiers bien, mais quand je supprimer une entrée de admin le fichier sur le serveur ne prend pas en supprimer.
Réponses
Trop de publicités?Vous pouvez recevoir le pre_delete signal et d'appeler la méthode delete sur la FileField objet, donc (en models.py):
class MyModel(models.Model):
file = models.FileField()
...
# Receive the pre_delete signal and delete the file associated with the model instance.
from django.db.models.signals import pre_delete
from django.dispatch.dispatcher import receiver
@receiver(pre_delete, sender=MyModel)
def mymodel_delete(sender, instance, **kwargs):
# Pass false so FileField doesn't save the model.
instance.file.delete(False)
Django 1.5 solution: j'utilise post_delete pour diverses raisons qui sont à l'intérieur de mon application.
from django.db.models.signals import post_delete
from django.dispatch import receiver
@receiver(post_delete, sender=Photo)
def photo_post_delete_handler(sender, **kwargs):
photo = kwargs['instance']
storage, path = photo.original_image.storage, photo.original_image.path
storage.delete(path)
J'ai collé cette au bas de la models.py fichier.
l' original_image
domaine est l' ImageField
mon Photo
modèle.
Ce code fonctionne bien sur Django 1.4 également avec le panneau d'administration.
class ImageModel(models.Model):
image = ImageField(...)
def delete(self, *args, **kwargs):
# You have to prepare what you need before delete the model
storage, path = self.image.storage, self.image.path
# Delete the model before the file
super(ImageModel, self).delete(*args, **kwargs)
# Delete the file after the model
storage.delete(path)
Il est important d'obtenir le stockage et le chemin d'accès avant de supprimer le modèle ou le dernier persiste vide aussi, si supprimés.
Vous pouvez envisager d'utiliser un pre_delete ou post_delete signal:
https://docs.djangoproject.com/en/dev/topics/signals/
Bien sûr, les mêmes raisons que FileField de suppression automatique a été retiré s'appliquent également ici. Si vous supprimez un fichier qui est référencé quelque part d'autre, vous aurez des problèmes.
Dans mon cas, cela semblait approprié parce que j'avais un Fichier dédié modèle pour gérer l'ensemble de mes fichiers.
Note: Pour une raison post_delete ne semble pas marcher droit. Le fichier a été supprimé, mais l'enregistrement de base de données est resté, qui est complètement à l'opposé de ce que je m'attends, même dans des conditions d'erreur. pre_delete fonctionne très bien.
C'est peut-être un peu tard. Mais la façon la plus simple pour moi est d'utiliser un post_save signal. Juste pour rappeler que les signaux sont excecuted même lors d'un QuerySet processus de suppression, mais le [modèle].méthode delete() n'est pas excecuted au cours de la QuerySet processus de suppression, il n'est donc pas la meilleure option pour le remplacer.
core/models.py:
from django.db import models
from django.db.models.signals import post_delete
from core.signals import delete_image_slide
SLIDE1_IMGS = 'slide1_imgs/'
class Slide1(models.Model):
title = models.CharField(max_length = 200)
description = models.CharField(max_length = 200)
image = models.ImageField(upload_to = SLIDE1_IMGS, null = True, blank = True)
video_embed = models.TextField(null = True, blank = True)
enabled = models.BooleanField(default = True)
"""---------------------------- SLIDE 1 -------------------------------------"""
post_delete.connect(delete_image_slide, Slide1)
"""--------------------------------------------------------------------------"""
core/signals.py
import os
def delete_image_slide(sender, **kwargs):
slide = kwargs.get('instance')
try:
os.remove(slide.image.path)
except:
pass