2010-05-20 17 views
20

Sto usando Django per creare un sito di fotografia di stock, ho un ImageField nel mio modello, il problema è che quando l'utente aggiorna il campo dell'immagine, il file di immagine originale non viene cancellato dal disco rigido.Come eliminare la vecchia immagine quando si aggiorna ImageField?

Come posso cancellare le vecchie immagini dopo un aggiornamento?

risposta

13

Dovrai eliminare manualmente la vecchia immagine.

Il percorso assoluto dell'immagine è memorizzato in your_image_field.name. Così si farebbe qualcosa di simile:

os.remove(your_image_field.name) 

Ma, come vantaggio, è possibile utilizzare l'oggetto FieldFile associato, che offre un facile accesso al file sottostante, oltre a fornire alcuni metodi di convenienza. Vedere http://docs.djangoproject.com/en/dev/ref/models/fields/#filefield-and-fieldfile

+0

Non è questo il comportamento predefinito di django ImageField? basato su questo post: http://www.redrobotstudios.com/blog/2010/03/02/dont-delete-image-file-when-deleting-django-model-instance/? –

+0

L'OP stava chiedendo di aggiornare un'istanza del modello con un ImageField (ad esempio, l'utente carica una nuova immagine). In tal caso, la vecchia immagine non viene cancellata. –

+0

Nota: non sono sicuro se è cambiato da allora o se questo è leggermente fuori, ma in 1.6 imgfield.name è un percorso relativo. imgfield.file.name ha il percorso completo. – kungphu

10

Utilizzare questo metodo di salvataggio personalizzati nel modello:

def save(self, *args, **kwargs): 
    try: 
     this = MyModelName.objects.get(id=self.id) 
     if this.MyImageFieldName != self.MyImageFieldName: 
      this.MyImageFieldName.delete() 
    except: pass 
    super(MyModelName, self).save(*args, **kwargs) 

Funziona per me sul mio sito. Questo problema mi dava fastidio e non volevo fare uno script di pulizia invece di una buona contabilità in primo luogo. Fammi sapere se ci sono problemi con esso.

+8

Si potrebbe voler usare: 'this.MyImageFieldName.delete (save = False)' perché ho visto le chiamate delete() in modo ricorsivo il 'save' del modello 'MyModelName', attenzione ... e testare con una stampa nel metodo di salvataggio –

+1

È anche meglio cancellare il file dopo la cancellazione del modello stesso. Se l'eliminazione del modello non riesce, per qualsiasi motivo non si desidera perdere il file. – Reza

12

Usa django-cleanup

pip install django-cleanup 

settings.py

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

) 
2

Ecco un'app che elimina i file orfani di default: django-smartfields. Sarà rimuovere file ogni volta:

  • valore campo è stato sostituito con uno nuovo (sia caricato o impostato manualmente)
  • campo è eliminato attraverso il modulo (nel caso quello campo non è obbligatorio, ovviamente)
  • l'istanza del modello stessa contenente il campo viene cancellata.

È possibile attivare questa funzione pulitura fuori usando un argomento: ImageField(keep_orphans=True) in base al campo, o globalmente nelle impostazioni SMARTFIELDS_KEEP_ORPHANS = True.

from django.db import models 

from smartfields import fields 

class MyModel(models.Model): 
    image = fields.ImageField() 
    document = fields.FileField() 
Problemi correlati