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

Posted

技术标签:

【中文标题】将 BinaryField 的文件上传小部件添加到 Django Admin【英文标题】:Adding file upload widget for BinaryField to Django Admin 【发布时间】:2020-02-20 01:40:13 【问题描述】:

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

然而,我惊讶地发现即使 BinaryField 可以设置为可编辑,Django Admin 也不会为其创建文件上传小部件。

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

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

【问题讨论】:

【参考方案1】:

@Ania Warzecha,抱歉,如何扩展这个以供下载?

【讨论】:

【参考方案2】:

您将需要专门为BinaryField 创建一个自定义Widget,它必须在将文件内容放入数据库之前读取它们。

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

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

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

    fields = ('name', 'your_binary_file')

注意:

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

【讨论】:

以上是关于将 BinaryField 的文件上传小部件添加到 Django Admin的主要内容,如果未能解决你的问题,请参考以下文章

如何将从文件上传小部件上传的假脱机文件传递到 C FILE *f 指针

动态图像上传到备用gridster小部件上

Angularjs:Cloudinary 上传小部件中的预填充搜索字段

如何将小部件动态添加到网格?

如何将 Switch Qml 添加到 qt 小部件?

netbeans:如何将小部件添加到 QT 变量