Django Imagekit перезаписывает имя_файла?

Я пытаюсь переписать cachefile_name свойство из модуля django-imagekit.

Вот мой код:

class Thumb150x150(ImageSpec):
    processors = [ResizeToFill(150, 150)]
    format = 'JPEG'
    options = {'quality': 90}

    @property
    def cachefile_name(self):
        # simplified for this example
        return "bla/blub/test.jpg"

register.generator('blablub:thumb_150x150', Thumb150x150)

class Avatar(models.Model):
avatar= ProcessedImageField(upload_to=upload_to,
                            processors=[ConvertToRGBA()],
                            format='JPEG',
                            options={'quality': 60})
avatar_thumb = ImageSpecField(source='avatar',
                              id='blablub:thumb_150x150')

Это не работает вообще.
Когда я отлаживаю (без перезаписи cachefile_name) и посмотрите возвращаемое значение cachefile_name, в результате получается строка типа "CACHE/blablub/asdlkfjasd09fsaud0fj.jpg". Где моя ошибка?

Есть идеи?

2 ответа

Решение

Точно скопировав пример, я смог нормально работать. Несколько предложений:

1) Убедитесь, что вы используете avatar_thumb в представлении. Файл "bla/blub/test.jpg" не будет сгенерирован до тех пор.

2) Проверьте конфигурацию вашего MEDIA_ROOT, чтобы убедиться, что вы знаете, где ожидается появление "bla/blub/test.jpg".

Позвольте мне привести пример чего-то подобного, над которым я работал. Я хотел дать своим эскизам уникальные имена, которые можно предсказать из исходного имени файла. Схема по умолчанию в Imagekit называет миниатюры на основе хэша, что я не могу догадаться. Вместо этого:

media/12345.jpg
media/CACHE/12345/abcde.jpg

Я хотел это:

media/photos/original/12345.jpg
media/photos/thumbs/12345.jpg

Переопределение IMAGEKIT_SPEC_CACHEFILE_NAMER не сработало, потому что я не хотел, чтобы все мои кэшированные файлы оказались в каталоге "thumbs", только те, которые были сгенерированы из определенного поля в конкретной модели.

Поэтому я создал этот подкласс ImageSpec и зарегистрировал его:

class ThumbnailSpec(ImageSpec):
    processors=[Thumbnail(200, 200, Anchor.CENTER, crop=True, upscale=False)]
    format='JPEG'
    options={'quality': 90}

    # put thumbnails into the "photos/thumbs" folder and
    # name them the same as the source file
    @property
    def cachefile_name(self):
        source_filename = getattr(self.source, 'name', None)
        s = "photos/thumbs/" + source_filename
        return s

register.generator('myapp:thumbnail', ThumbnailSpec)

И затем использовал это в моей модели, как это:

# provide a unique name for each image file
def get_file_path(instance, filename):
    ext = filename.split('.')[-1]
    return "%s.%s" % (uuid.uuid4(), ext.lower())

# store the original images in the 'photos/original' directory
photoStorage = FileSystemStorage(
    location=os.path.join(settings.MEDIA_ROOT, 'photos/original'),
    base_url='/photos/original')

class Photo(models.Model):
    image = models.ImageField(storage=photoStorage, upload_to=get_file_path)
    thumb = ImageSpecField(
        source='image',
        id='myapp:thumbnail')

Я думаю, правильный путь - установить IMAGEKIT_SPEC_CACHEFILE_NAMER. Посмотрите на namer names.py по умолчанию, он соединяет settings.IMAGEKIT_CACHEFILE_DIR с путем к файлу и хэшем, вероятно, вы должны сделать то же самое.

Другие вопросы по тегам