你能为管理员推荐一个好的django文件管理器吗?

你能为管理员推荐一个好的django文件管理器吗?,django,django-admin,Django,Django Admin,我正在寻找一个健壮、稳定的django文件管理器,用于django管理 我的愿望清单: 允许浏览和选择服务器上的文件(例如图像) 允许上传文件。多个文件上传会很好(例如uploadify) 不要求我在模型定义中使用自定义字段(就像django filebrowser那样)。我想要一些理想情况下可以附加到admin.py中的CharField(或FileField的ImageField)的东西,比如Carl Meyer的 我用过(非笔译版),也看过(但没有用过)。两个都很好。但是django fi

我正在寻找一个健壮、稳定的django文件管理器,用于django管理

我的愿望清单:

  • 允许浏览和选择服务器上的文件(例如图像)
  • 允许上传文件。多个文件上传会很好(例如uploadify)
  • 不要求我在模型定义中使用自定义字段(就像django filebrowser那样)。我想要一些理想情况下可以附加到admin.py中的CharField(或FileField的ImageField)的东西,比如Carl Meyer的
  • 我用过(非笔译版),也看过(但没有用过)。两个都很好。但是django filebrowser要求在我的模型中使用自定义字段,而且我不想要“版本”(多个图像大小)功能。django adminfiles用于将文件作为内联线插入文本区域,所以这不是我想要的


    我很乐意修改其中的一个来满足我的需要,但如果我缺少其他的选择,我也不愿意这么做

    FWIW,django adminfiles还嵌入了一些新功能,可以使用文件浏览器作为选择下拉列表的替代品:因此,您的模型将有一个指向“FileUpload”模型的外键,您可以通过浏览来填充该外键。这和你想要的更接近吗


    我已经有一段时间不需要或使用该功能了,它没有文档记录或测试,而且自从我添加它以来,已经有很多重写,所以它可能处于工作状态,也可能不处于工作状态。但总有一天我要把它恢复到工作状态,这是我的任务清单,我当然不会反对一点积极的帮助;-)

    发布这个问题后,我发现django filebrowser有一个FileBrowseWidget。应用了一些难看的黑客,我就能够在django管理员中对ImageField和FileField进行操作(不再需要模型上的
    filebrowser.fields.FileBrowseField

    我正在这样使用它(来自github的wardi),它似乎正在工作

    # a few changes to filebrowser/fields.py
    
    class FileBrowseWidget(Input):
        ...
    
        # change the default value of attrs from None to {}
        def __init__(self, attrs={}):
           ... # the rest unchanged
    
        # change the default value of attrs, and the first few lines of render, like so
        def render(self, name, value, attrs={}):
            if value is None:
                value = ""
            else:
                # set an attribute on value that the filebrowser templates need in 
                # order to display the thumbnail photo in the admin
                for suffix in ['gif', 'GIF', 'jpg', 'JPG', 'png', 'PNG']:
                    if hasattr(value, 'path') and value.path.endswith("." + suffix):
                        value.filetype = "Image"
                        break
            ... # the rest unchanged
    
    
    # admin.py
    
    from filebrowser.fields import FileBrowseWidget
    
    class FileBrowseForm(forms.ModelForm):
        # Use a CharField, not an ImageField or FileField, since filebrowser
        # is handling any file uploading
        image = forms.CharField(required=True, widget=FileBrowseWidget())
    
    class SomeModelAdmin(admin.ModelAdmin):
        # SomeModel has an ImageField named image
        form = FileBrowseForm
    
        ... # the rest of the admin definition
    

    这有点难看,但目前似乎还有效。它消除了对django filebrowser的模型级依赖,并将依赖关系推送到管理员,这正是我想要的

    作为@zlovelady答案的补充,我还想将django文件浏览器与模型定义分离

    也许他们的代码已经改变了,但是配方已经不太管用了。为了让它工作(通过对FileBrowserWidget进行子分类),我最终得到了以下结果:


    我没有使用非图形化版本,但我认为这不重要,两个版本中的相关代码看起来都一样。

    这更接近我要寻找的,但不完全相同。为了消除对其他应用程序的依赖,我希望我的模型能够使用CharField/FileField/ImageField。然后,文件管理器将根据用户选择使用相对路径更新CharField。看起来django adminfiles正在为文本区域中的“内联线”插入做类似的事情。如果没有其他答案出现在这里,我可能会尝试更改您的django管理员文件。(顺便说一句,这是一个不错的应用。谢谢!)如果有一个小部件,可以修改这个小部件,并将其用作
    FilePathField
    上的小部件,我认为这就像
    CharField
    一样,限制了对特定路径中文件的选择。@zlovelady-这是一个非常好的分离使用方法;我不会反对将这样一个特性引入django管理员文件。@Carl Meyer-太好了。如果我着手实现它,我将在github上使用django AdminFile的fork。似乎不再需要模型中的自定义字段。
    from filebrowser.base import FileObject
    from filebrowser.fields import FileBrowseWidget as fb_FileBrowseWidget
    from filebrowser.sites import site as filebrowser_site
    
    class FileBrowseWidget(fb_FileBrowseWidget):
        def render(self, name, value, attrs=None):
            if value is None:
                value = ""
            else:
                value = FileObject(value.name, site=self.site)
            return super(FileBrowseWidget, self).render(name, value, attrs)
    
    class FileBrowseForm(forms.ModelForm):
        # Use a CharField, not an ImageField or FileField, since filebrowser
        # is handling any file uploading
        image = forms.CharField(
            required=True,
            widget=FileBrowseWidget(attrs={'site':filebrowser_site})
        )