Динамическая загрузка изображений / путь просмотра для 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)),  
]

Надеюсь, что это небольшое обновление сэкономит кому-то пару минут.

Другие вопросы по тегам