Django - актуализирането на модел няма да изтрие стария FileField

Внедрявам приложение с django, което има модел с 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")

и имам администраторски бекенд, където django управлява моделите. Току-що добавих файла admin.py и django управлява всичко вместо мен

from django.contrib import admin

from apps.gallery.models import Slideshow

admin.site.register(Slideshow)

В бекенда е възможно да добавяте, изтривате и актуализирате слайдшоута. Въпреки това, когато се опитам да актуализирам слайдшоу и променя миниатюрата на неговия атрибут [FileField], django не изтрива стария файл. Следователно, след няколко актуализации сървърът е пълен с много файлове, които са безполезни. Въпросът ми е: как мога да накарам django да изтрие тези файлове автоматично след актуализация?

Наистина ще се радвам на вашата помощ


person Raul San N.H.    schedule 07.01.2010    source източник


Отговори (2)


Сигурен съм, че Django прави това по дизайн. Той не може да знае например дали други модели може да използват този файл. Също така ще бъдете наистина изненадани, ако очаквате файлът да остане и откриете, че django го е изтрил!

Има обаче и проблем, че веднага щом промените полето за файл, вие губите старото име на файл.

Има отворен билет за този проблем: http://code.djangoproject.com/ticket/11663

Има корекция в http://code.djangoproject.com/ticket/2983, която показва как за да замените __set__, за да съхраните предишното име на файл. След това методът __save__ на вашия модел може да получи достъп до предишното име на файл, за да го изтрие.

person Seth    schedule 07.01.2010
comment
Да, прав си! Разработчиците на django изглежда работят в нов дизайн за този случай в новите версии. Една от опциите е да добавите допълнителна опция във FileFields, за да направите файловете заменими при качвания: groups.google.com/group/django-developers/browse_thread/thread/ Подкрепям тази идея, благодаря ти за помощта, Сет, може да използвам корекцията, за която ми каза. - person Raul San N.H.; 08.01.2010
comment
Просто имах друга идея - можете да опитате да добавите опцията show_hidden_initial към вашия FileField. Предполага се, че това ще ви даде достъп до оригиналната стойност на FileField, преди да бъде качен нов файл. - person Seth; 11.01.2010

Мислих много за този проблем и в крайна сметка открих решение, което работи добре за мен. Можете да намерите всички модели в проекта и да свържете pre_save и post_delete сигнали към тях.

В крайна сметка направих приложение, което решава този проблем - django-cleanup

person un1t    schedule 17.08.2012
comment
Изглежда страхотно решение. Вече не работя върху django и не мога да го тествам, но ви благодаря за вашия принос, un1t! - person Raul San N.H.; 29.08.2012