Джанго. Как программно переименовать файлы, загруженные с помощью django-filer

Допустим, я выбираю 10 файлов для загрузки с помощью django-filer. У них изначально очень случайные имена. Хотелось бы иметь набор правил, по которым их надо переименовывать и только потом передавать на дальнейшую обработку (миниатюры и т.д.).

Мне нужно на самом деле переименовать все, особенно имя файла, а не только имя модели изображения.

Я попытался поймать сигнал pre_save для модели изображения и изменить instance.original_filename, но это не переименование имени файла. Или, может быть, мне следует создать подкласс и переопределить что-то из пакета файлов?

Я был бы признателен за пример кода, потому что это немного сложно для меня.


person gwaramadze    schedule 24.09.2013    source источник


Ответы (1)


Я использовал form_valid(self, form) в views.py для обработки изображений и управления ими. Полный код немного длинный и очень специфичный, но я опубликую несколько фрагментов, которые должны показать идею того, как генерировать имена файлов:

def form_valid(self, form):
    upload = self.request.FILES['profilbild_original'] #coming from a very simple form
    self.request.user.student.profilbild_original = upload
    self.request.user.student.save()
    #no renaming was required here, but now I did some work:

    inputfilepath = os.path.join(my_app.settings.MEDIA_ROOT, profilbild_path(self.request.user, str(upload)))
    original = Image.open(inputfilepath) 
    original.thumbnail((200,200), Image.ANTIALIAS)
    filename = str(upload)+'.thumbnail_200_200_aa.jpg'
    filepath = profilbild_path(self.request.user, filename)
    filepath = os.path.join(my_app.settings.MEDIA_ROOT, filepath)
    original.save(filepath, 'JPEG', quality=90)
    self.request.user.student.profilbild = profilbild_path(self.request.user, filename).replace("\\", "/")
    self.request.user.student.save()

    return super(ProfilbildView, self).form_valid(form)  

profilbild_pathэто функция согласно https://docs.djangoproject.com/en/1.3/ref/models/fields/#django.db.models.FileField.upload_to :

def profilbild_path(instance, filename):
    return os.path.join('profilbilder', str(instance.id), filename)

Надеюсь, это даст вам некоторые подсказки.

person OBu    schedule 25.09.2013
comment
этот ответ помог? Вам нужно больше информации? - person OBu; 27.09.2013
comment
Боюсь, мне это не помогло. У меня нет собственных представлений для обработки загрузок, я использую django-filer. Где именно я должен поместить этот метод form_valid? - person gwaramadze; 02.10.2013