保存带默认字段值的Django ModelForm
我有一个模型叫做 FooModel
,里面有两个字段,这些字段有默认值(default=xxx
)并且被标记为可以留空(blank=True
)。我用这个模型创建了一个表单(django.forms.ModelForm
),现在我想在用户提交后保存这个表单,所以在我的视图中有以下代码:
f = FooForm(request.POST)
if f.is_valid():
f.save()
问题是这样做会导致数据库出现异常,因为在HTML表单中没有显示的字段并不会自动被包含在 FooForm
实例中,这和我预期的不一样……我该如何包含那些不想让用户看到的原始模型字段呢?(我不想把它们作为隐藏字段显示!)
到目前为止,我尝试了两种方法,但都失败了……
在
FooForm
的构造函数中指定实例(f = FooForm(request.POST, instance=FooModel())
)创建一个
FooModel
的实例,并手动将自动生成的值分配给表单的数据:i = FooModel() f.data.fieldA = i.fieldA f.data.fieldB = i.fieldB
更新:
通过更仔细地阅读Django的文档,我用这种方式解决了问题:
if f.is_valid():
formModel = f.save(commit=False)
foo = FooModel()
formModel.fieldA = foo.fieldA
formModel.fieldB = foo.fieldB
formModel.save()
不过,老实说,我并不满意……我想把这些字段的添加过程抽象出来……也许可以使用自定义装饰器……类似于:
f = MissingFieldsDecorator(FooForm(request.POST))
f.save()
2 个回答
0
我该如何包含原始模型中的字段,但又不想让用户看到这些字段呢?
针对你这个问题的回答是
class FooForm(ModelForm):
class Meta:
model = FooModel
exclude = ('not_displayed_field',)