queryset - models py python
¿Cómo eliminar una imagen anterior cuando se actualiza ImageField? (5)
Antes de actualizar la instancia del modelo, puede usar el método de FileField
objeto FileField
. Por ejemplo, si FileField
o ImageField
se nombra como photo
y la instancia de su modelo es profile
, lo siguiente eliminará el archivo del disco
profile.photo.delete(False)
Para mayor aclaración, aquí está el django doc
Estoy usando Django para crear un sitio de fotos, tengo un ImageField en mi modelo, el problema es que cuando el usuario actualiza el campo de imagen, el archivo de imagen original no se elimina del disco duro.
¿Cómo puedo eliminar las imágenes antiguas después de una actualización?
Aquí hay una aplicación que elimina los archivos huérfanos por defecto: django-smartfields . Eliminará archivos cuando:
- el valor del campo fue reemplazado por uno nuevo (ya sea cargado o configurado manualmente)
- el campo se borra a través del formulario (en caso de que ese campo no sea obligatorio, por supuesto)
- la instancia del modelo en sí que contiene el campo se elimina.
Es posible desactivar esa función de limpieza utilizando un argumento: ImageField(keep_orphans=True)
por campo, o globalmente 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()
Tendrás que eliminar la imagen anterior manualmente.
La ruta absoluta a la imagen se almacena en your_image_field.name
. Entonces harías algo como:
os.remove(your_image_field.name)
Pero, para su comodidad, puede usar el objeto FieldFile asociado, que le da fácil acceso al archivo subyacente, y le proporciona algunos métodos de conveniencia. Ver http://docs.djangoproject.com/en/dev/ref/models/fields/#filefield-and-fieldfile
Use django-cleanup
pip install django-cleanup
settings.py
INSTALLED_APPS = (
...
''django_cleanup'', # should go after your apps
)
Use este método de guardado personalizado 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.