2016-04-03 11 views
0

私はDjango Formsetsを使用して複数のフォームを作成しています。 最初はフォームが1つしかなく、JavaScriptを使用してフォームを動的に追加しています。 このフォームを送信すると、request.POSTオブジェクトには最初のフォームのデータしかありません。 ちなみに、formsetを2つの初期フォームを表示して送信するように設定すると、両方のフォームがあります。 問題は、私はJavaScriptのDjango Formsetには1つのフォームしかありません。残りのデータは空です。

//forms.py 
from django import forms 

class AddUserForm(forms.Form): 
first_name = forms.CharField(max_length=50) 
last_name = forms.CharField(max_length=50) 
email = forms.EmailField() 
password1 = forms.CharField(widget=forms.PasswordInput) 
password2 = forms.CharField(widget=forms.PasswordInput) 


//views.py (this one to handle the get) 
if request.method == 'GET': 
    add_user_formset = formset_factory(AddUserForm, extra=1, max_num=6) 
    context['add_user_formset'] = add_user_formset 

//view.py (this one to handle the post of the form) 
@login_required(login_url = reverse_lazy('login')) 
def add_users(request, ir_id): 
    if request.method == 'POST': 
     my_form = formset_factory(AddUserForm) 
     my_formset = my_form(request.POST) 

     if my_formset.is_valid(): 
      for form in my_formset: 
       if form.is_valid(): 
        email = form.cleaned_data['email'] 
        username = form.cleaned_data['email'] 
        first_name = form.cleaned_data['first_name'] 
        last_name = form.cleaned_data['last_name'] 
        password = form.cleaned_data['password1'] 
        user = User(email=email,first_name=first_name,last_name=last_name,username=username) 
        user.set_password(password) 
        user.save() 
        new_user_profile = UserProfile.objects.get(id=user.id) 
        new_user_profile.user_role = users_role[0][0] 
        new_user_profile.save() 
        ir_obj = IR.objects.get(ir_id=int(ir_id)) 
        ir_obj.users.add(new_user_profile) 
    return HttpResponseRedirect(request.META.get('HTTP_REFERER')) 



//template 
<form action="{% url 'add_users' ir_id %}" method="post" >{% csrf_token %} 
        {{add_user_formset.management_form}} 
        {% for item in add_user_formset%} 
         <tr> 
          <td><div>{{item.first_name}}</div></td> 
          <td><div>{{item.last_name}}</div></td> 
          <td><div>{{item.email}}</div></td> 
          <td><div>{{item.password1}}</div></td> 
          <td><div>{{item.password2}}</div></td> 
         </tr> 
        {% endfor %} 
        <input type="submit" name="submit" class="btn btn-primary" value="Create account"> 
        </form> 





//JavaScript 

    $(document).on("click", ".irStatus-add-another-user", function() { 
    var count = parseInt($('#id_form-TOTAL_FORMS').val()) 
    var newRow = $('.add-users-table tbody tr:last').clone(true) 

    newRow.find(':input').each(function(){ 
     var name = $(this).attr('name').replace('-' + (count-1) + '-','-' + (count) + '-'); 
     var id = 'id_' + name; 
     $(this).attr('id', id); 
     $(this).attr('name', name); 
     $(this).val(''); 
    }) 
    newRow.appendTo('.add-users-table tbody') 
    $('#id_form-TOTAL_FORMS').val(''+(count+1)) 
}); 

答えて

0

を使用して新しいものを追加したときにフォームセットを決定するために、このフィールドを使用してあなたは、あなたが新しいフォームを追加するときだけでなくジャバスクリプトによって、管理フォームからあなた<form>-TOTAL_FORMSフィールドをインクリメントする必要が起こります提供される書式の量 Formset Management Form docs

関連する問題