Загрузите изображение в ведро 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() удалит изображение из ведра.