Вы захотите создать пользовательский 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')
Примечание:
BinaryField
не имеет URL-адреса или имени файла, поэтому вы не сможете проверить, что находится в БД - После загрузки файла вы сможете увидеть только размер в байтах значения, хранящегося в БД
- Возможно, вы захотите расширить виджет, чтобы иметь возможность загружать файл, читая егосодержание