Как изменить хранилище файлов django по умолчанию на облачное хранилище медиафайлов?

Я работаю над проектом django. Он отлично работает с локальным хранилищем и решил использовать cloudinary для хранения мультимедиа, но по какой-то причине хранилище файлов не переключается на облачное хранилище мультимедиа.

Вот мой settings.py файл:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    "listings",

    "rest_framework",
    "rest_framework_simplejwt",
    "corsheaders",
    'django_filters',

    'cloudinary_storage',
    'cloudinary',
]

# Cloudinary config
CLOUDINARY_STORAGE = {
    "CLOUD_NAME": config("CLOUDINARY_CLOUD_NAME"),
    "API_KEY": config("CLOUDINARY_API_KEY"),
    "API_SECRET": config("CLOUDINARY_API_SECRET"),
}

cloudinary.config( 
  cloud_name = config('CLOUDINARY_CLOUD_NAME'), 
  api_key = config('CLOUDINARY_API_KEY'), 
  api_secret = config('CLOUDINARY_API_SECRET')
)


DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'

model.py файл:

class Amenity(models.Model):
    name = models.CharField(max_length=100, unique=True)
    icon = models.ImageField(upload_to='amenity_icons/', null=True)

Я попытался загрузить с помощью панели администратора. Он сохраняется локально, несмотря на настройки DEFAULT_FILE_STORAGE для 'cloudinary_storage.storage.MediaCloudinaryStorage'

Конфигурация среды загружена правильно (я проверил, распечатав). Вот вывод отладочной оболочки:

>>> from django.conf import settings
>>> from django.core.files.storage import default_storage
>>> print(settings.DEFAULT_FILE_STORAGE)
cloudinary_storage.storage.MediaCloudinaryStorage
>>> print(default_storage.__class__) 
<class 'django.core.files.storage.filesystem.FileSystemStorage'>

Я буду работать, если вручную укажу хранилище в каждом поле изображения в каждой модели.

from cloudinary_storage.storage import MediaCloudinaryStorage

class Amenity(models.Model):
    name = models.CharField(max_length=100, unique=True)
    icon = models.ImageField(
                upload_to='amenity_icons/', 
                null=True, 
                storage=MediaCloudinaryStorage
           )

Ваши настройки кажутся правильными, но, похоже, вам не хватает MEDIA_URL. В ваших настройках:

MEDIA_URL = '/media/'  # or any prefix you choose

Также обратите внимание, что вам не нужно настраивать хранилище для загружаемых пользователем медиафайлов, поскольку оно будет использовать значение по умолчанию, которое вы уже установили в DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'

Смотрите https://pypi.org/project/django-cloudinary-storage/

Использовать параметр хранилища: вместо DEFAULT_FILE_STORAGE попробуйте использовать параметр STORAGES, который является рекомендуемым способом настройки хранилища файлов в Django 4.2 и более поздних версиях:

STORAGES = {
    "default": {
        "BACKEND": "cloudinary_storage.storage.MediaCloudinaryStorage",
    },
    "staticfiles": {
        "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
    },
}
Вернуться на верх