在django中保存同一表单的多个实例

时间:2016-04-19 09:10:25

标签: django forms model save multiple-instances

在我的模板中,用户可以添加(使用添加按钮:))另一个相同形式的实例(空的一个)但当我点击提交(保存)时,最后一个输入正在保存。 views.py:

def form_valid(self, form):
        self.object = form.save()
        return HttpResponseRedirect(self.get_success_url())

模板:

<form action="{{ action }}" class="form-horizontal form-inline" method="post" enctype="multipart/form-data">

  {% csrf_token %}

{% if object.id %}
  <legend>Edit Object2</legend>
{% else %}
  <legend>Add Object2</legend>
{% endif %}

  {{ form }}

  <div class="objects2">
      {% for objects2_form in form %}
        <div id="objects2-{{ forloop.counter0 }}">


        </div>
      {% endfor %}
  </div>

 <div class="form-actions">
   <a href="#" id="add-object2" class="btn btn-info add-object2" >Add object2</a>
   <button type="submit" class="btn btn-primary">Submit</button>
 </div>
</form>

修改 我已经决定在此时发布一个对象并保存渲染同一页面更容易。我现在的问题是页面上只显示了1个(最后一个)表单而不是全部。 (全部保存在db中)。如何将空表格显示为最后一个?

EDIT2: 我成功地展示了所有:

object2 = object2Model.objects.all()
        return  render_to_response('xxx.html', 
                          {'form': form, 'object2': object2}, context_instance = RequestContext(self.request))

所以只剩下一件事......如何显示空表? (不使用formset)

1 个答案:

答案 0 :(得分:0)

将重复表单数据标记的name属性。因此,例如,最后一个<input type="text" name="firstname">将覆盖具有相同name="firstname"名称的所有先前字段。

在同一个<form/> DOM元素中,没有任何内置方法可以使相同的表单字段呈现两次。

我会将forms.Form个实例渲染到不同的<form/>元素中,并让一个加入提交<button onclick="submitAllForms()">的调用Javascript来提交所有现有的<forms/>个对象。

这将是最干净的方式,特别是对于您的服务器端模型。

因此,在加载时,您只需选择空表单DOM元素并复制它。然后,当用户选择添加表单的另一个实例时,您可以使用该副本作为模板向页面添加另一个表单。您可以使用相同数量的相同形式,无需额外工作。

然后,当用户提交表单时,只需选择所有<form> DOM元素并在每个元素上调用.sumbit()。而且您的服务器只会看到提交的常规forms.Form个实例。