将BinaryField的文件上传小部件添加到Django Admin

时间:2019-10-23 18:34:30

标签: django django-admin

我们需要将一些较小的文件存储到数据库中(是的,我很清楚这些反对意见,但是将FileField设置为在几种环境中工作似乎对于两个文件来说非常繁琐,并且将文件放在数据库也将解决备份要求。

但是,令我惊讶的是,即使BinaryField可以设置为可编辑的,但Django Admin并未为其创建文件上传小部件。

我们对BinaryField唯一需要的功能是可以上传文件并替换现有文件。除此之外,Django Admin可以满足我们的所有要求。

我们如何对Django Admin进行此修改?

2 个答案:

答案 0 :(得分:0)

您将要创建一个专门针对Widget的自定义BinaryField,该自定义文件class BinaryFileInput(forms.ClearableFileInput): def is_initial(self, value): """ Return whether value is considered to be initial value. """ return bool(value) def format_value(self, value): """Format the size of the value in the db. We can't render it's name or url, but we'd like to give some information as to wether this file is not empty/corrupt. """ if self.is_initial(value): return f'{len(value)} bytes' def value_from_datadict(self, data, files, name): """Return the file contents so they can be put in the db.""" upload = super().value_from_datadict(data, files, name) if upload: return upload.read() 在将文件内容放入数据库之前必须先读取文件内容。

class MyModelAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.BinaryField: {'widget': BinaryFileInput()},
    }

    fields = ('name', 'your_binary_file')

然后您需要通过以下方式在admin中使用它:

BinaryField

注意:

  • name没有网址或文件名,因此您将无法检查数据库中的内容
  • 上传文件后,您将只能看到存储在数据库中的值的字节大小
  • 您可能希望扩展小部件以能够下载文件 通过阅读内容

答案 1 :(得分:0)

@Ania Warzecha,对不起,但是如何扩展此下载范围?