Django - mettre à jour un modèle ne supprime pas l'ancien FileField
Question
Je suis une application avec la mise en œuvre django, qui a un modèle avec un 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")
et j'ai un backend admin où django gère les modèles. Je viens d'ajouter le fichier admin.py et django gère tout pour moi
from django.contrib import admin
from apps.gallery.models import Slideshow
admin.site.register(Slideshow)
Dans le back-end, il est possible d'ajouter, de supprimer et mettre à jour les diaporamas. Cependant, lorsque je tente de mettre à jour un diaporama et modifier sa vignette d'attribut [FileField], django ne supprime pas l'ancien fichier. Par conséquent, après plusieurs mises à jour le serveur est rempli de nombreux fichiers qui sont inutiles. Ma question est: comment puis-je faire django supprimer ces fichiers automatiquement après une mise à jour
Je serais vraiment reconnaissant de votre aide
La solution
Je suis sûr que Django fait en design. Il ne peut pas savoir, par exemple, si d'autres modèles pourraient utiliser ce fichier. Vous aussi être vraiment surpris si vous attendiez le fichier à rester et a découvert que django supprimé!
Cependant, il y a aussi la question que dès que vous modifiez le champ de fichier, vous perdez l'ancien nom de fichier.
Il y a un billet ouvert sur ce problème: http://code.djangoproject.com/ticket/11663
Il y a un patch http://code.djangoproject.com/ticket/2983 qui montre comment remplacer __set__
pour enregistrer le nom de fichier précédent. Ensuite, la méthode de __save__
de votre modèle peut avoir accès au nom de fichier précédent pour le supprimer.
Autres conseils
Je pensais beaucoup à ce problème, et finalement je trouve une solution que fonctionne bien pour moi. Vous pouvez trouver tous les modèles de projet et de connecter des signaux pre_save et post_delete pour eux.
A la fin je fait application, qui Sloves ce problème - django-nettoyage