使用form.save(commit = False)和多个字段名称保存模型Formset

时间:2009-07-28 07:25:27

标签: django django-forms

据我所知,Django不允许您在从模型创建的单个表单中保存不完整的字段,除非您这样做:

tmpform = form.save(commit=False)
tmpform.foo = form.cleaned_data['foo']
tmpform.save()

所以我想用formset中的表单来做这种事情 - 我试图遍历formset中每个表单的所有字段。但问题是我不确定如何遍历formset中每个表单的所有字段。我试过这个:

for form in formset.forms:
  for name, field in form.fields.items():
    tmpform = form.save(commit=False)
    tmpform.field[name] = form.cleaned_data[name] # doesn't work, I get an error
    tmpform.save()

但我只收到错误消息:

'FooForm' object has no attribute 'field'.

我的问题是:如果我在一个具有不同字段名称的表单中有多个字段,我该如何正确使用form.save(commit = False)?

2 个答案:

答案 0 :(得分:1)

尝试使用setattr,因为您不知道该字段的名称。

setattr(tmpform, field, form.cleaned_data[name])

答案 1 :(得分:0)

在摆弄之后我想我发现了似乎适用于我的目的的语法:

if formset.is_valid():
   for form in formset.forms:
     tmpform = form.save(commit=False)
     for field in form:
        if not field.form.is_bound:
          data = field.form.initial.get(field.name,
                                field.field.initial)
          if callable(data):
            data = data()
        else:
          data = field.data

        setattr(tmpform, field.name, data)
        print "fieldname: %s - value: %s" %(field.name,data)

     tmpform.save()