Загрузите изображение в ведро S3 с помощью django-ckeditor

У меня есть модель Article с текстовой областью "content". Я решил заменить этот textarea (мне нужна была возможность вставлять изображения внутрь формы) на CK-Editor, поэтому я использовал пакет django-ckeditor

Теперь у меня проблема - когда я загружаю изображение с помощью формы CKEditorUploadingWidget(), она сохраняет данные в локальное хранилище (я имею в виду в папку, указанную в этой переменной CKEDITOR_UPLOAD_PATH = "uploads/" ), однако, хранилище S3 было настроено, поэтому я не знаю, почему оно не работает

Вот мой код:

 <form method="POST">
            {{ form.media }}
            {{ form|crispy }}
            {% csrf_token %}
            <button type="submit" class="btn btn-primary my-3">Add</button>
        </form>

Настройки, относящиеся к этой теме:

    CKEDITOR_CONFIGS = {
    "default": {
        'toolbar': 'full',
        'width': 'auto'
    }
}

CKEDITOR_IMAGE_BACKEND = "pillow"
CKEDITOR_UPLOAD_PATH = "uploads/"
CKEDITOR_RESTRICT_BY_USER = True
CKEDITOR_ALLOW_NONIMAGE_FILES = False

AWS_QUERYSTRING_AUTH = False


S3_ACCESS_KEY_ID = 'secret'
S3_SECRET_ACCESS_KEY = 'secret'
S3_FILE_UPLOAD_BUCKET_NAME = 'bucket-name'
S3_FILE_UPLOAD_BUCKET_URL = 'some url'

Если вы используете S3 в качестве файлового хранилища по умолчанию...

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

Вы можете просто создать модель ArticleImage, например...

class ArticleImage(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE, null=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    image = models.ImageField(upload_to=some_dir_on_bucket_or_path_handler_function)

Если для параметра default_file_storage установлено значение S3, он будет автоматически обрабатывать загрузку/удаление изображений S3 при выполнении .save() или .delete()

Где-то в вашей логике обработки запроса на пост изображения, это загрузит изображение.

img = ArticleImage.objects.create(user=self.request.user, image=your_image_object)
        img.user = self.request.user
        img.save()

В то время как img.delete() удалит изображение из ведра.

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