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

时间:2010-01-09 05:31:27

标签: django django-admin

我正在寻找一个强大,稳定的django文件管理器,可以在django admin中使用。

我的要求愿望清单:

  1. 允许浏览和选择服务器上的文件(例如图片)
  2. 允许上传文件。多个文件上传会很棒(例如,使用uploadify)
  3. 不要求我在模型定义中使用自定义字段(如django-filebrowser那样)。我想要一些理想情况下可以附加到admin.py的CharField(或FileField的ImageField)的东西,比如Carl Meyer的django-adminfiles
  4. 我使用了django-filebrowser(非grappelli版本),还查看了(但未使用过)django-adminfiles。两者都很好。但是django-filebrowser需要在我的模型中使用自定义字段,而且我不想要'版本'(多个图像大小)功能。 django-adminfiles用于将文件作为内联插入textareas,所以不是我想要的。

    我很高兴修改其中一个以满足我的需求,但是如果有其他替代方案我不想这样做会讨厌。

3 个答案:

答案 0 :(得分:2)

FWIW,django-adminfiles还隐藏了一些初出茅庐的功能,使用文件浏览器作为select-dropdown替换:所以你的模型将有一个ForeignKey到“FileUpload”模型,你就可以浏览了填写那个ForeignKey。那更接近你想要的吗?

我在相当长的一段时间内没有需要或使用过这个功能,它没有记录或测试过,而且自从我添加它以来已经进行了大量的重写,因此可能会或可能不会处于工作状态。但是在我的待办事项列表中,有一天将其恢复到工作状态,我当然不会反对一点积极的帮助; - )

答案 1 :(得分:2)

作为@zlovelady答案的附录,我还想将django-filebrowser与我的模型定义分离。

也许他们的代码已经改变了,但是配方不再适用了。我最终得到了它(通过对FileBrowserWidget进行子类化):

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})
    )

我没有使用no-grappelli版本,但我认为不重要,相关代码在两个版本中看起来都一样。

答案 2 :(得分:1)

自发布问题以来,我发现django-filebrowser有一个FileBrowseWidget。随着一些丑陋的黑客应用,我能够在ImageField和FileField上的django管理员工作(模型上不再需要filebrowser.fields.FileBrowseField)。

我正在使用它(在{github使用来自wardi的non-grappelli-dependent django-filebrowser),它似乎正在工作。

# 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的模型级依赖,并将依赖项推送到admin,这是我想要的地方。