保存带默认字段值的Django ModelForm

0 投票
2 回答
5018 浏览
提问于 2025-04-17 14:45

我有一个模型叫做 FooModel,里面有两个字段,这些字段有默认值(default=xxx)并且被标记为可以留空(blank=True)。我用这个模型创建了一个表单(django.forms.ModelForm),现在我想在用户提交后保存这个表单,所以在我的视图中有以下代码:

f = FooForm(request.POST)

if f.is_valid():
  f.save()

问题是这样做会导致数据库出现异常,因为在HTML表单中没有显示的字段并不会自动被包含在 FooForm 实例中,这和我预期的不一样……我该如何包含那些不想让用户看到的原始模型字段呢?(我不想把它们作为隐藏字段显示!)

到目前为止,我尝试了两种方法,但都失败了……

  1. FooForm 的构造函数中指定实例(f = FooForm(request.POST, instance=FooModel())

  2. 创建一个 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',)

撰写回答