2010-01-07 2 views
6

ich eine Anwendung mit django bin der Umsetzung, die ein Modell mit einem Filefield hat:Django - Aktualisiere ein Modell wird die alte Filefield nicht löschen

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

und ich habe ein Admin-Backend, wo django die Modelle verwaltet. Habe ich nur noch die Datei admin.py und django verwaltet alles für mich

from django.contrib import admin 

from apps.gallery.models import Slideshow 

admin.site.register(Slideshow) 

Im Backend ist es möglich, zu ergänzen, zu löschen und die Diashows zu aktualisieren. Wenn ich jedoch versuche, eine Diashow zu aktualisieren und ihre Attributminiatur [FileField] zu ändern, löscht django die alte Datei nicht. Folglich ist der Server nach mehreren Aktualisierungen mit vielen Dateien gefüllt, die nutzlos sind. Meine Frage ist: Wie kann ich Django diese Dateien automatisch nach einem Update löschen lassen?

würde ich wirklich schätzen Ihre Hilfe

Antwort

1

Ich bin sicher, dass Django tut dies durch Design. Es kann beispielsweise nicht wissen, ob andere Modelle diese Datei verwenden. Du wärst auch wirklich überrascht, wenn du erwartet hast, dass die Datei bleibt und entdeckt, dass django sie gelöscht hat!

Es gibt jedoch auch das Problem, dass Sie den alten Dateinamen verlieren, sobald Sie das Dateifeld ändern.

Es ist ein offenes Ticket über dieses Problem: http://code.djangoproject.com/ticket/11663

Es gibt einen Patch in http://code.djangoproject.com/ticket/2983, die zeigt, wie __set__ außer Kraft setzt die vorherigen Dateinamen zu speichern. Dann kann die Methode __save__ Ihres Modells auf den vorherigen Dateinamen zugreifen, um ihn zu löschen.

+0

Ja, Sie haben Recht! Die Django-Entwickler scheinen in neuen Versionen für diesen Fall in einem neuen Design zu arbeiten. Eine der Optionen ist das Hinzufügen einer zusätzlichen Option in FileFields, um Dateien beim Hochladen austauschbar zu machen: http://groups.google.com/group/django-developers/browse_thread/thread/491619541ba6ac75 Ich unterstütze diese Idee, " Danke für deine Hilfe Seth "Ich könnte den Patch benutzen, von dem du mir erzählt hast. – raulsan

+0

Hatte nur eine andere Idee - Sie könnten versuchen, die Option ** show_hidden_initial ** zu Ihrem 'FileField' hinzuzufügen. Vermutlich würden Sie damit auf den ursprünglichen Wert des 'FileField' zugreifen, bevor eine neue Datei hochgeladen wurde. – Seth

2

Ich habe viel über dieses Problem nachgedacht, und irgendwann finde ich eine Lösung, die gut für mich funktioniert. Sie können alle Modelle im Projekt finden und die Signale pre_save und post_delete mit ihnen verbinden.

Am Ende habe ich App, die Sloves dieses Problem - django-cleanup

+0

Sieht nach einer großartigen Lösung aus. Ich arbeite nicht mehr am Django und kann es nicht testen, aber ich danke dir für deinen Beitrag, un1t! – raulsan

Verwandte Themen