Как сохранить CloudinaryField в папке, названной пользователем

Я пытаюсь загрузить изображение в cloudinary с помощью CloudinaryField в моем models.py. Я хочу, чтобы изображение было загружено в папку в cloudinary, названную в этом формате : users/<username>/pictures/profile. Пока я понял, что могу установить folder и public_id поле, но не могу назвать его динамически. например, я могу передать функцию в upload_to ключ в ImageField, чтобы создать изображение там, где я хочу. есть ли способ сделать это с CloudinaryField? спасибо заранее!

При использовании CloudinaryField оно может принимать параметры, определенные в документации Upload API. Имя папки (или префикс) может быть предоставлено как folder=some/target/foldername, а использование обоих параметров use_filename=True и unique_filename=False установит public_id для использования имени файла актива. В противном случае, использование динамического значения также может быть задано как public_id=some-dynamic-custom-value.

Например:

           image = CloudinaryField('image',
                        public_id='dynamicpublicid',
                        use_filename=True,
                        unique_filename=False,
                        folder='users/username/pictures/profile')

Единственное решение, которое я смог придумать, основываясь на этом вопросе (предложенный ответ не сработал) - это переопределить pre_save следующим образом:

class CloudinaryField(CloudinaryField):
def upload_options(self, instance):
    return {
        'folder': "users/{0}/cats/{1}".format(instance.owner.username,instance.name),
        'public_id': 'profile',
        'overwrite': True,
        'resource_type': 'image',
        'quality': 'auto:eco',
    }
def pre_save(self, model_instance, add):
    self.options =  dict(list(self.options.items()) + list(self.upload_options(model_instance).items())) 
    super().pre_save(model_instance, add)

Я не знаю, хорошее ли это решение, но оно работает...

Вернуться на верх