我想创建一个模型Changelog
并使其可从管理页面进行编辑。这是它的定义方式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)
title
and description
是必要的,link
and picture
是可选的。我想让这个模型尽可能简单,所以我选择BinaryField
over FileField
。在这种情况下,我不需要担心需要备份的单独文件夹,因为数据库将是独立的(我不需要存储文件名或任何其他属性,只需存储图像内容).
我很快意识到,Django Admin 没有一个小部件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)
正如你所看到的有点老套。您还可以通过子类化创建自己的表单字段forms.FileField
,但代码几乎是相同的。它对我来说工作得很好,但现在我在想有没有更好/标准的方法来完成相同的任务?