3

我想使用 tinyMCE 作为 django 应用程序的编辑器,但遇到了一些麻烦。我已经完成了所有设置,但似乎无法为图像插入/上传功能指定上传路径。我有两个特定的场景,这会成为一个问题:

  • 用户提交内容的文件浏览器不应显示其他用户上传的文件。我想通过用户 ID 将它们“监禁”到特定目录。
  • 我需要一种将上传的文件与它们相关的对象链接的方法。这样,如果对象不再存在,我可以在将来修剪这些文件,并且我可以在文件浏览器中仅显示与该对象相关的图像。

django-tinymce-filebrowser 自动将上传路径设置为 mce_filebrowser/%Y/%m/%d。似乎没有以任何方式更改此路径的选项。

django-filebrowser 有在 settings.py 中设置上传目录的选项,但我无法找到任何人为特定模型表单实例覆盖该路径的记录。我找到的最接近的是Django 文件浏览器,FileBrowserField 的模型特定目录参数,但我认为那里的解决方案不适用于我的情况。

有没有人为 django-tinymce 使用另一个文件浏览器?您是否有类似的问题并找到解决方法?我会很感激任何正确方向的观点。

4

3 回答 3

2

我使用了类似的方法,但没有修改 django-filebrowser 代码,我最终在 FileBrowserSite 的子类中扩展了 browse() 方法并在那里进行了修改:

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)),  
]

我认为这是一种比修改源代码更简洁的方法,并且在我的项目中工作起来很有吸引力。

于 2016-04-26T01:53:40.020 回答
1

我已经,有点破解了这个。我在 grappelli 2.7.2 和 django-filebrowser 3.6.1 上。

我刚刚在 django-filebrowser 文件中添加了一行:sites.py: 在 FileBrowserSite 类的方法 browse() 上,第 ~273 行,我添加了:

self._directory_set(DIRECTORY + str(request.user) + "/")

尽管已经为每个用户创建了一个目录,但这很重要,您可以在每次创建用户时发出 post_save 信号来创建一个目录。此解决方案不会将文件与对象相关联,但我认为这对您来说可能是一个好的开始,它将隔离不同用户的文件。

对我来说,这目前工作得很好,我可以想象这不是最完美的方法,非常欢迎反馈。

于 2015-11-11T12:25:16.883 回答
1

我已经扩展了Erasmo的答案。一般来说,它工作得很好。谢谢!然而,正如OriolJ 所指出的,每个用户都需要一个创建的目录来使用文件浏览器。建议避免使用信号,所以我将功能添加到自定义FileBrowserSite.

文件浏览器.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)

设置.py

FILEBROWSER_DIRECTORY = 'user_content/'
DIRECTORY = ''

网址.py

from .filebrowser import site

urlpatterns = [
    url(r'^admin/content/file/', include(site.urls)),  
]

希望这个轻微的更新可以为某人节省几分钟。

于 2018-06-30T21:45:58.037 回答