2010-01-07 2 views
6

Я реализующее приложение с Джанго, который имеет модель с FileField:Джанго - обновление модели не будет удалять старый 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") 

и у меня есть администратор бэкэнда, где Джанго управляет моделью. Я просто добавил файл admin.py и Джанго управляет всем для меня

from django.contrib import admin 

from apps.gallery.models import Slideshow 

admin.site.register(Slideshow) 

В интерфейсе можно добавлять, удалять и обновлять слайд-шоу. Однако, когда я пытаюсь обновить слайд-шоу и изменить его атрибут thumbnail [FileField], django не удаляет старый файл. Следовательно, после нескольких обновлений сервер заполняется множеством файлов, которые бесполезны. Мой вопрос: как я могу сделать django автоматически удалять эти файлы после обновления?

Я очень ценю вашу помощь

ответ

1

Я уверен, что Django делает это дизайн. Например, он не может знать, могут ли какие-либо другие модели использовать этот файл. Вы также были бы очень удивлены, если бы ожидали, что файл останется и обнаружил, что django удалил его!

Однако есть проблема, что как только вы измените поле файла, вы потеряете старое имя файла.

Там в открытом билет об этой проблеме: http://code.djangoproject.com/ticket/11663

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

+0

Да, вы правы! Разработчики django, похоже, работают в новом дизайне для этого случая в новых выпусках. Один из вариантов заключается в добавлении дополнительной опции в FileFields для замены файлов при загрузке: http://groups.google.com/group/django-developers/browse_thread/thread/491619541ba6ac75 Я поддерживаю эту идею, " Спасибо за вашу помощь. Сет: «Я могу использовать этот патч, о котором вы мне рассказывали. – raulsan

+0

У вас была другая идея - вы можете попробовать добавить ** show_hidden_initial ** в свой 'FileField'. Предположительно, это даст вам доступ к исходному значению «FileField» до того, как будет загружен новый файл. – Seth

2

Я много думал об этой проблеме, и, в конце концов, я нашел решение, отличное для меня. Вы можете найти все модели в проекте и подключить к ним сигналы pre_save и post_delete.

В конце концов, я сделал приложение, который sloves этой проблемы - django-cleanup

+0

Похоже, отличное решение. Я больше не работаю над django и не могу его протестировать, но я благодарю вас за ваш вклад, un1t! – raulsan

Смежные вопросы