Надо бы тоже какие-нибудь интересные куски кода выкладывать, а то в гугле не так то просто ищутся интересные вещи
Стандартный upload в Django может легко сам раскидывать закачиваемые файлы по папкам
Но когда файл удаляется, то папки остаются живы
Обычно на это пофиг, так как на сайте живет не один файл и папку удалять не приходится
Но иногда, когда дерево слишком большое или у программиста паталогическая чистоплотность охота автоматом удалять пустые папки
Вот у меня файлы живут в папках вида
/2009/05/06/a29ac73569edd9e329471d9d232d59a9/protokol-8.doc
Так как Python и Django ужас как ООП, то самый красивый и грамотный метод — это отсубкласситься от родного класса и переопределить нужную функцию. Удаление файла проиходит в Storage, так что надо написать свой. От самого Storage субкласситься конечно не надо, ибо обычными файловыми системами заведует FileSystemStorage. Вот от него мы и будем делать нашего ребенка.
import os
from django.core.files.storage import FileSystemStorage
class FileSystemStorageFoldered(FileSystemStorage ):
def delete(self, name, *args, **kwargs ):
super(FileSystemStorageFoldered, self ).delete(name, *args, **kwargs )
try:
os.removedirs(os.path.dirname(self.path(name )))
except OSError:
pass
Сначала мы удаляем сам файл методом родительского класса, а потом удаляем и сами папки. Если папки не пустые, то выкидывается исключение OSError, но в данном случае мы его просто игнорируем, так как именно такое поведение нам и нужно
А потом надо просто сказать в нашей модели, что надо использовать новый Storage вместо обычного
file = models.FileField(upload_to = upload_callback_document,\
storage = FileSystemStorageFoldered )
Acer X960
[Print]
Гость