Как загрузить файлы в BinaryField с помощью виджета FileField в администраторе Django?Python

Программы на Python
Anonymous
Как загрузить файлы в BinaryField с помощью виджета FileField в администраторе Django?

Сообщение Anonymous »

Я хочу создать журнал изменений модели и сделать его доступным для редактирования на странице администратора. Вот как это определено в models.py:

Код: Выделить всё

class Changelog(models.Model):
id = models.AutoField(primary_key=True, auto_created=True)
title = models.TextField()
description = models.TextField()
link = models.TextField(null=True, blank=True)
picture = models.BinaryField(null=True, blank=True)
и описание являются обязательными, ссылка и изображение не являются обязательными. Я хотел сделать эту модель максимально простой, поэтому выбрал BinaryField вместо FileField. В этом случае мне не нужно будет беспокоиться об отдельной папке, которую нужно создать резервную копию, поскольку БД будет автономной (Мне не нужно хранить имя файла или какие-либо другие атрибуты, только содержимое изображения) .

Я быстро понял, что у администратора Django нет виджета для BinaryField, поэтому я попробовал использовать виджет для FileField. Вот что я сделал для этого(

Код: Выделить всё

admin.py
):

Код: Выделить всё

class ChangelogForm(forms.ModelForm):

picture = forms.FileField(required=False)

def save(self, commit=True):
if self.cleaned_data.get('picture') is not None:
data = self.cleaned_data['picture'].file.read()
self.instance.picture = data
return self.instance

def save_m2m(self):
# FIXME: this function is required by ModelAdmin, otherwise save process will fail
pass

class Meta:
model = Changelog
fields = ['title', 'description', 'link', 'picture']

class ChangelogAdmin(admin.ModelAdmin):
form = ChangelogForm

admin.site.register(Changelog, ChangelogAdmin)
Как видите, это немного хакерски. Вы также можете создать собственное поле формы, создав подкласс form.FileField, но код будет практически таким же. У меня все работает нормально, но теперь я думаю, есть ли лучший/стандартный способ выполнить ту же задачу?

Подробнее здесь: https://stackoverflow.com/questions/466 ... ango-admin

Вернуться в «Python»