2013-06-03 2 views
0


Я использую django-stdimage в веб-приложении django. Я хочу загружать изображения, используя динамическую структуру файлов в соответствии с тем, когда изображение было загружено. Например:django-stdimage динамическая файловая структура

snapshot/<year>/<month>/<filename> 

Поэтому, если я загрузил изображение в мае 2013 года, образ должен быть помещен в этот каталог:

snapshot/2013/05/ 

Мой код выглядит в моем models.py:

class Snapshot(BaseModel): 
... 
image = StdImageField(upload_to='snapshot/%Y/%m', blank=False, size=(1170, 780), thumbnail_size=(100, 100, True)) 
... 

В моем шаблоне, я показываю миниатюру, как это:

<img src="{{snapshot.image.thumbnail.url}}"> 

С тех пор мы загрузили много изображений в мае месяце. Однако теперь, когда мы переключались с мая по июнь, все пути эскизов теперь указывают на июнь (текущий месяц), а не май (месяц, в который мы загрузили изображения).

Кто-нибудь знает, как я исправлю это для будущих загруженных файлов, а также файлы, которые были загружены в прошлом?

ответ

1

Мы встретили такую ​​же ошибку.

Причина этой ошибки: каждый раз, когда этот экземпляр StdImage инициализирует свое поле .thumbnail, он вызывает self.generate_filename, чтобы получить его имя файла, а затем вставить имя .thumnail в имя файла в виде имени эскиза.

Источник:

def _set_thumbnail(self, instance=None, **kwargs): 
    """Creates a "thumbnail" object as attribute of the ImageField instance 
    Thumbnail attribute will be of the same class of original image, so 
    "path", "url"... properties can be used 

    """ 

    if getattr(instance, self.name): 
     filename = self.generate_filename(instance, 
        os.path.basename(getattr(instance, self.name).path)) 

     thumbnail_filename = self._get_thumbnail_filename(filename) 
     thumbnail_field = ThumbnailField(thumbnail_filename) 
     setattr(getattr(instance, self.name), 'thumbnail', thumbnail_field) 

Это правильно, когда путь не является динамическим. Но когда мы используем динамический путь, такой как headimg = models.FileField(upload_to='headimg/%Y%m'), возврат self.generate_filename соответствует дате сегодняшнего дня, так что thumbnail.path изменяется каждый день.

Quick Fix:

В источнике stdimage/полей/Py

def _set_thumbnail(self, instance=None, **kwargs): 
    """Creates a "thumbnail" object as attribute of the ImageField instance 
    Thumbnail attribute will be of the same class of original image, so 
    "path", "url"... properties can be used 

    """ 

    if getattr(instance, self.name): 
     #fix the bug of wrong thumbnail path 
     #filename = self.generate_filename(instance, 
     #   os.path.basename(getattr(instance, self.name).path)) 
     file_path = getattr(instance, self.name).path 
     file_prefix = self.upload_to[:self.upload_to.find('/')] 
     filename = file_path[file_path.find(file_prefix):] 

     thumbnail_filename = self._get_thumbnail_filename(filename) 
     thumbnail_field = ThumbnailField(thumbnail_filename) 
     setattr(getattr(instance, self.name), 'thumbnail', thumbnail_field) 

Это работает для меня.

Я отправил вопрос на проект stdimage на github. Надеюсь, автор это исправит.

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