我正在寻找一个强大,稳定的django文件管理器,可以在django admin中使用。
我的要求愿望清单:
我使用了django-filebrowser(非grappelli版本),还查看了(但未使用过)django-adminfiles。两者都很好。但是django-filebrowser需要在我的模型中使用自定义字段,而且我不想要'版本'(多个图像大小)功能。 django-adminfiles用于将文件作为内联插入textareas,所以不是我想要的。
我很高兴修改其中一个以满足我的需求,但是如果有其他替代方案我不想这样做会讨厌。
答案 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,这是我想要的地方。