Django imagekit и динамические пути - PullRequest
1 голос
/ 16 января 2012

Я использую imagekit, предоставленный по адресу: imagekit

Итак, я определил две модели классов:

class Photo(models.Model):
    #photo_wrapper = models.ForeignKey(PhotoWrapper, blank=True, null=True)
    original_image = models.ImageField(upload_to='static/photos')
    thumbnail = ImageSpec([Adjust(contrast=1.2, sharpness=1.1),
            resize.Crop(50, 50)], image_field='original_image',
            format='JPEG', quality=90)
    num_views = models.PositiveIntegerField(editable=False, default=0)

    class IKOptions:
        # This inner class is where we define the ImageKit options for the model
        spec_module = 'myspecs.specs'
        cache_dir = 'static/photos'
        image_field = 'original_image'
        save_count_as = 'num_views'

class Country(models.Model):       
    country_name = models.CharField(max_length=250)        
    country_photo = models.ForeignKey(Photo, blank=True, null=True)

    def __unicode__(self):
            return '%s' % self.country_name 

Проблема в том, что каждая фотографиясозданный в пути "static / photos".Мое намерение - сохранить изображение и миниатюру с динамическим путем, основанным на названии страны.

Например, для страны "Аргентина" динамический путь будет "статический / фотографии / Аргентина /"

Как мне это сделать?

1 Ответ

1 голос
/ 31 января 2012

Похоже, вы смешиваете две разные версии ImageKit. Более новые версии (1.0+) больше не используют внутренний класс IKOptions, поэтому все это игнорируется. (Функция save_count_as также была удалена.)

Если вы хотите контролировать имя файла кэша, конструктор ImageSpec принимает cache_to kwarg, который, как и ImageField s upload_to, может вызываться. Вот текущая документация для cache_to:

Specifies the filename to use when saving the image
cache file. This is modeled after ImageField's ``upload_to`` and
can be either a string (that specifies a directory) or a
callable (that returns a filepath). Callable values should
accept the following arguments:

    - instance -- The model instance this spec belongs to
    - path -- The path of the original image
    - specname -- the property name that the spec is bound to on
        the model instance
    - extension -- A recommended extension. If the format of the
        spec is set explicitly, this suggestion will be
        based on that format. if not, the extension of the
        original file will be passed. You do not have to use
        this extension, it's only a recommendation.

Так что вам просто нужно создать функцию, которая принимает эти аргументы и возвращает желаемый путь, и использует его в вашей модели следующим образом:

class Photo(models.Model):
    thumbnail = ImageSpec(..., cache_to=my_cache_to_function)
...