Добавление виджета загрузки файлов для BinaryField в Django Admin - PullRequest
2 голосов
/ 23 октября 2019

Нам нужно сохранить несколько небольших файлов в базе данных (да, я хорошо знаю контраргументы, но настройка, например, FileField для работы в нескольких средах, кажется очень утомительной для пары файлов, и наличие файлов набаза данных также решает требования к резервному копированию).

Однако я с удивлением обнаружил, что, хотя BinaryField можно настроить для редактирования, Django Admin не создает для него виджет загрузки файлов.

Единственная функциональность, которая нам нужна для BinaryField, - это возможность загрузить файл и заменить существующий файл. Кроме этого, Django Admin отвечает всем нашим требованиям.

Как мы можем сделать это изменение для Django Admin?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2019

@ Аня Варзеча, извините, но как продлить загрузку?

0 голосов
/ 04 ноября 2019

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