Динамическая загрузка изображений / путь просмотра для django-tinymce
Я хотел бы использовать tinyMCE в качестве редактора для моего приложения django, но столкнулся с некоторыми проблемами. У меня все настроено, но, похоже, нет способа указать путь загрузки для функции вставки / загрузки изображения. У меня есть два конкретных сценария, где это становится проблемой:
- Файловый браузер для пользовательского контента не должен отображать файлы, загруженные другими пользователями. Я хотел бы заключить их в определенный каталог по идентификатору пользователя.
- Мне нужен способ связать загруженные файлы с объектом, с которым они связаны. Таким образом, я могу удалить эти файлы в будущем, если объект больше не существует, и я могу показывать только изображения, связанные с этим объектом, в обозревателе файлов.
django-tinymce-filebrowser автоматически устанавливает путь загрузки: mce_filebrowser/%Y/%m/%d. Кажется, нет возможности изменить этот путь в любом случае.
У django-filebrowser есть опции для установки каталога загрузки в settings.py, но я не смог найти записей о том, кто переопределяет этот путь для конкретного экземпляра модели. Самым близким, что я нашел, был Django filebrowser, специфичный для модели параметр каталога для FileBrowserField, но я думаю, что решение там не применимо к моей ситуации.
Кто-нибудь использует другой браузер файлов для django-tinymce? У вас была похожая проблема, и вы нашли решение? Буду признателен за любые пункты в правильном направлении.
3 ответа
Я использовал похожий подход, но вместо того, чтобы модифицировать код django-filebrowser, я в итоге расширил метод browse() в подклассе FileBrowserSite и сделал там изменение:
from django.core.files.storage import DefaultStorage
from filebrowser.sites import FileBrowserSite
class FileBrowserSite(FileBrowserSite):
def browse(self, request):
self.directory = self.directory + str(request.user) + '/'
return super(FileBrowserSite, self).browse(request)
storage = DefaultStorage()
site = FileBrowserSite(name='file', storage=storage)
site.directory = "content/"
Я поместил этот фрагмент кода в файл с именем filebrowser.py, а затем в мой urls.py:
from .filebrowser import site
urlpatterns = [
url(r'^admin/content/file/', include(site.urls)),
]
Я думаю, что это более чистый подход, чем изменение исходного кода, и он работает как шарм в моем проекте.
Я несколько взломал это. Я на grappelli 2.7.2, и django-filebrowser 3.6.1.
Я только что добавил строку в файл django-filebrowser: sites.py: в методе browse() класса FileBrowserSite, строка ~273, я добавил:
self._directory_set(DIRECTORY + str(request.user) + "/")
Хотя важно, что для каждого пользователя уже создан каталог, вы можете подать сигнал post_save для создания каталога каждый раз, когда создается пользователь. Это решение не будет связывать файлы с объектом, но я думаю, что это может быть хорошим началом для вас, и оно изолирует файлы разных пользователей.
Для меня это в настоящее время работает очень хорошо, я могу представить, что это не самый совершенный способ сделать это, обратная связь очень приветствуется.
Я немного расширил ответ Erasmo. Как правило, это прекрасно работает. Спасибо! Однако, как указал OriolJ, каждому пользователю нужен созданный каталог, чтобы использовать OriolJ. Рекомендуется избегать использования сигналов, поэтому я добавил функциональность в FileBrowserSite
,
filebrowser.py
import os
from django.conf import settings
from django.core.files.storage import DefaultStorage
from filebrowser.sites import FileBrowserSite
class FileBrowserSite(FileBrowserSite):
def browse(self, request):
# get directory path from settings to avoid recursion
self.directory = settings.DIRECTORY + str(request.user) + '/'
# create a directory for a user if it does not already exist
full_path = self.storage.location + '/' + self.directory
if not os.path.exists(full_path):
os.makedirs(full_path)
return super().browse(request)
storage = DefaultStorage()
site = FileBrowserSite(name='file', storage=storage)
settings.py
FILEBROWSER_DIRECTORY = 'user_content/'
DIRECTORY = ''
urls.py
from .filebrowser import site
urlpatterns = [
url(r'^admin/content/file/', include(site.urls)),
]
Надеюсь, что это небольшое обновление сэкономит кому-то пару минут.