django-tinymce的动态图像上传/浏览路径

时间:2014-02-15 07:47:27

标签: django django-tinymce django-filebrowser

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

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

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

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

是否有人使用另一个文件浏览器进行django-tinymce?你有类似的问题并找到解决方案吗?我很欣赏正确方向的任何一点。

3 个答案:

答案 0 :(得分: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)),  
]

我认为这比修改源代码要简洁得多,而且在我的项目中就像魅力一样。

答案 1 :(得分: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信号来创建目录。此解决方案不会将文件与对象相关联,但我认为这对您来说可能是一个良好的开端,它会隔离不同用户的文件。

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

答案 2 :(得分:1)

我通过Erasmo扩展了答案。通常,它的效果很好。谢谢!但是,正如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)),  
]

希望此轻微更新将为您节省几分钟的时间。