【发布时间】:2018-03-23 09:11:00
【问题描述】:
我想创建一个模型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 和 description 是必需的,link 和 picture 是可选的。我想让这个模型尽可能简单,所以我选择了BinaryField 而不是FileField。在这种情况下,我不需要担心需要备份的单独文件夹,因为 DB 将是独立的(我不需要存储文件名或任何其他属性,只需存储图像内容) .
我很快意识到,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,但代码几乎相同。它对我来说很好,但现在我在想是否有更好/标准的方法来完成相同的任务?
【问题讨论】: