Если кто-то искал это недавно, как и я, и ему нужно решение, чтобы заставить django-tinymce4-lite работать с django-хранилищами и django-filebrowser-no-grappelli, мне удалось заставить его работать следующим образом:
1) Следуйте этому превосходному учебнику: https://fosstack.com/how-to-set-up-tinymce-in-django-app/
2) Когда дело доходит до работы части s3, вам необходимо установить django-хранилища и настроить медиасредства, как описано в инструкциях здесь
3) Вам нужно создать подкласс S3Boto3Storage и сделать его своим DEFAULT_FILE_STORAGE
, как показано ниже:
DEFAULT_FILE_STORAGE = 'module.containing.MediaStorage'
4) И внутри этого модуля создайте класс MediaStorage со следующим API для работы с FileBrowser
class MediaStorage(S3Boto3Storage):
location = settings.MEDIAFILES_LOCATION
def isdir(self, name):
if not name: # Empty name is a directory
return True
if self.isfile(name):
return False
for item in super(MediaStorage, self).listdir(name):
if len(item):
return True
return False
def isfile(self, name):
try:
name = self._normalize_name(self._clean_name(name))
f = S3Boto3StorageFile(name, 'rb', self)
if "directory" in f.obj.content_type:
return False
return True
except Exception:
return False
def makedirs(self, name):
name = self._normalize_name(self._clean_name(name))
return self.bucket.meta.client.put_object(Bucket=self.bucket.name, Key=f'{name}/')
def rmtree(self, name):
name = self._normalize_name(self._clean_name(name))
delete_objects = [{'Key': f"{name}/"}]
dirlist = self.listdir(self._encode_name(name))
for item in dirlist:
for obj in item:
obj_name = f"{name}/{obj}"
if self.isdir(obj_name):
obj_name = f"{obj_name}/"
delete_objects.append({'Key': obj_name})
self.bucket.delete_objects(Delete={'Objects': delete_objects})
def path(self, name):
return name
def listdir(self, name):
directories, files = super().listdir(name)
if '.' in files:
files.remove('.')
return directories, files
def exists(self, name):
if self.isdir(name):
return True
else:
return super().exists(name)
def get_modified_time(self, name):
# S3 boto3 library requires that directorys have the trailing slash
if self.isdir(name):
name = f'{name}/'
return super().get_modified_time(name)
def size(self, name):
# S3 boto3 library requires that directorys have the trailing slash
if self.isdir(name):
name = f'{name}/'
return super().size(name)
Надеюсь, это поможет