【问题标题】:Saving multiple instances of same form in django在 django 中保存相同表单的多个实例
【发布时间】:2016-08-11 08:40:13
【问题描述】:

在我的模板中,用户可以添加(使用添加按钮:))相同表单的另一个实例(空一个 ofc),但是当我单击提交(保存)时,只有最后输入的一个被保存。 视图.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 个(最后一个)表单而不是全部。 (所有都保存在数据库中)。以及如何将空表单显示为最后?

EDIT2: 我已经成功展示了所有内容:

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

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

【问题讨论】:

    标签: django forms model save multiple-instances


    【解决方案1】:

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

    实际上并没有任何内置方法可以让相同的表单字段在同一个&lt;form/&gt; DOM 元素内呈现两次。

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

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

    因此,在加载时,您可以简单地选择空的表单 DOM 元素并复制它。然后,当用户选择添加表单的另一个实例时,您可以使用该副本作为模板将另一个表单添加到页面。您可以通过这种方式拥有任意数量的相同表单,无需额外工作。

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

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多