Как сохранить 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)
Я не знаю, хорошее ли это решение, но оно работает...