【问题标题】:Model Formset saving with form.save(commit=False) and multiple field names使用 form.save(commit=False) 和多个字段名称保存模型 Formset
【发布时间】:2010-11-14 14:39:42
【问题描述】:

我了解 Django 不会让您将不完整的字段保存在从模型创建的单个表单中,除非您这样做:

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

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

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)?

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      在摆弄之后,我想我找到了似乎适合我的目的的语法:

      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()
      

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多