2010-01-07 14 views
6

Me estoy poniendo en práctica una aplicación con Django, que tiene un modelo con un FileField:Django - actualizar un modelo no eliminará el antiguo FileField

class Slideshow(models.Model): 
    name = models.CharField(max_length=30,unique=True) 
    thumbnail = models.FileField(max_length=1000,upload_to="images/app/slideshows/thumbnails") 

y tengo un backend de administración de Django, donde gestiona los modelos. Acabo de añadir el archivo y admin.py Django maneja todo para mí

from django.contrib import admin 

from apps.gallery.models import Slideshow 

admin.site.register(Slideshow) 

En el back-end, es posible añadir, eliminar y actualizar las presentaciones de diapositivas. Sin embargo, cuando intento actualizar una presentación de diapositivas y cambiar su miniatura de atributo [FileField], django no elimina el archivo anterior. En consecuencia, después de varias actualizaciones, el servidor se llena con muchos archivos que son inútiles. Mi pregunta es: ¿cómo puedo hacer que django elimine esos archivos automáticamente después de una actualización?

Realmente agradecería su ayuda

Respuesta

1

Estoy seguro de Django hace esto por diseño. No puede saber, por ejemplo, si otros modelos podrían estar usando ese archivo. ¡También te sorprendería mucho si esperabas que el archivo permaneciera y descubrieras que django lo eliminó!

Sin embargo, también existe el problema de que tan pronto como cambie el campo de archivo, perderá el nombre del archivo anterior.

Hay un billete abierto en ese problema: http://code.djangoproject.com/ticket/11663

Hay un parche en http://code.djangoproject.com/ticket/2983 que muestra cómo reemplazar __set__ para almacenar el nombre del archivo anterior. Luego, el método __save__ de su modelo puede obtener acceso al nombre del archivo anterior para eliminarlo.

+0

Sí, tiene usted razón! Los desarrolladores de django parecen estar trabajando en un nuevo diseño para este caso en nuevos lanzamientos. Una de las opciones es agregar una opción adicional en FileFields para que los archivos se puedan reemplazar en las cargas: http://groups.google.com/group/django-developers/browse_thread/thread/491619541ba6ac75 Apoyo esta idea, " Gracias por su ayuda Seth "Podría usar ese parche del que me habló. – raulsan

+0

Acabo de tener otra idea: puede intentar agregar la opción ** show_hidden_initial ** a su 'FileField'. Es de suponer que eso le daría acceso al valor original de 'FileField' antes de que se cargue un archivo nuevo. – Seth

2

Pensé mucho acerca de este problema, y ​​finalmente encontré una solución que funciona bien para mí. Puede encontrar todos los modelos en proyecto y conectarles las señales pre_save y post_delete.

Al final hice aplicación, que Sloves este problema - django-cleanup

+0

Parece una gran solución. Ya no estoy trabajando en django y no puedo probarlo, pero ¡Gracias por tu contribución, un1t! – raulsan

Cuestiones relacionadas