2016-04-19 15 views
1

を保存すると、同じフォームの別のインスタンス(空のone ofc)を追加できますが、Submit(save)をクリックすると最後に入力したものが保存されます。 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> 

EDIT:私はそれが一度に一つのオブジェクトを投稿する方が簡単ですし、同じページをレンダリング節約に決めました 。問題今私は1つ(最後の)フォームがすべてではなくページに表示されているということです。 (すべてがdbに保存されます)。最後に空のフォームを表示する方法は?

EDIT2: 私はすべてを表示することができた:

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

だから、唯一の1つのものは、空のフォームを表示する方法..残っています? (formsetを使用しないで)

答えて

0

フォームのデータタグの属性が繰り返されます。したがって、たとえば、最後の<input type="text" name="firstname">は、前のすべてのフィールドを同じname="firstname"という名前で上書きします。

実際に同じフォームフィールドを同じ<form/> DOM要素内に2回レンダリングする組み込み方法はありません。

私は別の<form/>要素にforms.Formインスタンスをレンダリングし、1を持っているでしょうが、すべての既存の<forms/>のオブジェクトを提出するJavascriptを呼び出す<button onclick="submitAllForms()">を提出参加しました。

これは、特にサーバー側のモデルで最もクリーンな方法です。

したがって、ロード時に空のフォームDOM要素を選択してコピーするだけで済みます。次に、ユーザーがフォームの別のインスタンスを追加することを選択すると、そのコピーをテンプレートとして使用して別のフォームをページに追加できます。あなたは、追加の作業をせずに、そのような形式の任意の数を持つことができます。

ユーザーがフォームを送信すると、<form> DOM要素をすべて選択し、それぞれに対して.sumbit()を呼び出します。そして、あなたのサーバーには通常のforms.Formインスタンスが送信されているだけです。

関連する問題