2010-05-20 26 views
20

Estoy utilizando Django para crear un sitio de fotos de archivo, tengo un ImageField en mi modelo, el problema es que cuando el usuario actualiza el campo de la imagen, el archivo de imagen original no se elimina del disco duro.Cómo eliminar una imagen anterior cuando se actualiza ImageField?

¿Cómo puedo eliminar las imágenes antiguas después de una actualización?

Respuesta

13

Deberá eliminar manualmente la imagen anterior.

La ruta de acceso absoluta a la imagen se almacena en your_image_field.name. Por lo que haría algo como:

os.remove(your_image_field.name) 

Pero, para su conveniencia, se puede utilizar el objeto FieldFile asociada, que proporciona un fácil acceso al archivo subyacente, así como proporcionar unos métodos de conveniencia. Ver http://docs.djangoproject.com/en/dev/ref/models/fields/#filefield-and-fieldfile

+0

¿No es este el comportamiento predeterminado de django ImageField? basado en esta publicación: http://www.redrobotstudios.com/blog/2010/03/02/dont-delete-image-file-when-deleting-django-model-instance/? –

+0

El OP preguntaba por la actualización de una instancia de modelo con un ImageField (es decir, el usuario carga una nueva imagen). En ese caso, la imagen anterior no se elimina. –

+0

Nota: No estoy seguro de si ha cambiado desde entonces o si está un poco apagado, pero en 1.6 imgfield.name es una ruta relativa. imgfield.file.name tiene la ruta completa. – kungphu

10

Uso esta costumbre método para guardar en su modelo:

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) 

Funciona para mí en mi sitio. Este problema también me molestaba y, en primer lugar, no quería hacer una secuencia de comandos de limpieza en lugar de una buena contabilidad. Avísame si hay algún problema con eso.

+8

Es posible que desee utilizar: 'this.MyImageFieldName.delete (save = False)' porque he visto las llamadas a delete() recursivamente 'guardar' del modelo 'MyModelName', tenga cuidado ... y pruebe con una impresión en el método de guardar –

+1

También es mejor eliminar el archivo después de la eliminación del propio modelo. Si al eliminar el modelo falla por alguna razón, no desea perder el archivo. – Reza

12

Uso django-cleanup

pip install django-cleanup 

settings.py

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

) 
2

Aquí hay una aplicación que elimina los archivos huérfanos por defecto: django-smartfields. Se eliminará archivos cuando:

  • valor del campo fue reemplazado por uno nuevo (ya sea subido o ajustar manualmente)
  • campo se elimina a través de la forma (en caso de que no se requiere que el campo, por supuesto)
  • se elimina la instancia del modelo que contiene el campo.

Es posible convertir esa característica de limpieza va a basar un argumento: ImageField(keep_orphans=True) en base al campo, o de forma global en la configuración SMARTFIELDS_KEEP_ORPHANS = True.

from django.db import models 

from smartfields import fields 

class MyModel(models.Model): 
    image = fields.ImageField() 
    document = fields.FileField() 
Cuestiones relacionadas