2016-10-25 3 views
0

django formsets 및 javascript를 사용하여 동적 양식을 작성했습니다. 그러나 불행히도 양식 제출시 첫 번째 양식 만 제출됩니다. 동적으로 추가 된 모든 양식도 제출하겠습니다. 어떤 도움을 주시면 감사하겠습니다. 조회수 :둘 이상의 양식으로 동적 formset 저장

def routestepinfo(request): 
    class RequiredFormSet(BaseFormSet): 
      def __init__(self, *args, **kwargs): 
       super(RequiredFormSet, self).__init__(*args, **kwargs) 
       for form in self.forms: 
        form.empty_permitted = False  
    RouteStepFormSet = formset_factory(RouteStepForm, formset=RequiredFormSet, extra=1, can_order=False, can_delete=True) 
    if request.method == 'POST': 
     formset = RouteStepFormSet(request.POST) 
     if formset.is_valid(): 
      for form in formset.forms: 
       form.save() 
       print 'apple' 
       return redirect("/buildpage/") 
    else: 
     formset = RouteStepFormSet() 
    return render(request, "buildpage/routestepinfo.html", {'formset' :formset}) 

HTML

<form id= "myForm" method = 'POST' action="{% url 'buildpage:routestepinfo' %}" enctype="multipart/form-data">{% csrf_token %} 
        {{ formset.management_form }} 
<div id="form_set">  
        {% for form in formset %} 
        <table class='no_error'> 
        <tbody>. 
        {{form.as_table}} 
        </tbody> 
        </table> 
        {% endfor %} 
</div> 
<p><input type = "button" value = "Add another step" id = "add_more" ></p> 
<div id="empty_form" style="display:none"> 
    <table class='no_error'> 
     {{ formset.empty_form.as_table }} 
    </table> 
</div> 
       <div id="forms"></div> 
    <p>&nbsp;</p> 
    <p>&nbsp;</p> 
       <input type = "submit" name = "Submit Steps"> 
        </form> 

JS 클론 :

<script> 
    $('#add_more').click(function() { 
     var form_idx = $('#id_form-TOTAL_FORMS').val(); 
     $('#form_set').append($('#empty_form').html().replace(/__prefix__/g, form_idx)); 
     $('#id_form-TOTAL_FORMS').val(parseInt(form_idx) + 1); 
    }); 
</script> 
+0

각 동적 양식에 고유 한 이름 속성을 부여하는 것으로 보이지 않습니다. 예. 'formset.empty_form.as_table' 안에있는 INPUT의 모든 것들은 이름 속성을 수정할 필요가있을 것입니다. 물론'__prefix__' 접두어가 붙지 않는 한. 크롬 디버거에서 양식을 보면 모든 필드가 고유 한 이름 속성을 갖게됩니다. – Keith

+0

안녕 키스, 내가 오해하지 않는 한 BaseFormSet이 __prefix__의 자동 접두사를 제공한다는 문서에 따르면. ''BaseFormSet''은 추가 매개 변수''empty_form'을 제공합니다. 이것은 형태의 접두어가''__prefix__'' 인 형태로, 형태의 자바 스크립트로보다 쉽게 ​​사용할 수 있도록 반환합니다. –

+0

그래서 후속 질문은 자바 스크립트를 통해 각 추가 양식에 고유 한 ID를 만드는 방법이 있습니까? –

답변

0

을 고정! 오직 일주일 만에했다. 결국 어떻게 작동하는지 알려드립니다. 뷰는 크게 수정되지 않았으며, 단지 커밋 = False가 추가되어 목록을 저장합니다.

자바 스크립트가 변경된 주요 항목이었습니다. 추가 된 항목이 많았으며, 매우 도움이되었습니다. 접두사가 첫 번째 문제 였고, formset.empty_form을 사용하여 수정되었습니다. 또 다른 중요한 부분은 전체 양식을 업데이트하는 것이었고 이로 인해 절약 문제가 해결되었습니다.

<script> 
$(document).ready(function() { 
    $('.add-item').click(function(ev) { 
     ev.preventDefault(); 
     var count = $('#items-form-container').children().length; 
     var tmplMarkup = $('#item-template').html(); 
     var compiledTmpl = tmplMarkup.replace(/__prefix__/g, count); 
     $('div#items-form-container').append(compiledTmpl); 

     // update form count 
     $('#id_form-TOTAL_FORMS').attr('value', count+1); 
     $('html, body').animate({ 
       scrollTop: $("#add-item-button").position().top-200 
      }, 800); 
    }); 
}); 
</script> 

마지막으로 html. 이것은 매우 도움이 SO 게시물 내 자신의 물건의 일부를 결합

 <div type="text/html" id="item-template"> 
      <table> 
       {{ formset.empty_form.as_table }} 
      </table> 
      </div> 
      <font face = Flexo> 
      <form id= "myForm" method = 'POST' action="{% url 'buildpage:routestepinfo' %}" enctype="multipart/form-data">{% csrf_token %} 
      {{ formset.management_form }} 
      <div id="items-form-container"> 

      {% for form in formset.forms %} 

      <div id="item-{{ forloop.counter0 }}"> 
      <table> 
      {{form.as_table}} 
      <table> 
      </div> 
      {% endfor %} 
      </div> 
      <a href="#" id="add-item-button" class="btn btn-info add-item">Add Step</a> 
     <input type = "submit" name = "Submit Steps"> 
      </form> 

희망이 어떤 사람들을 도움 : 해당 formset 거기에서 비어있는 형태로 생성 및 복제되는, (이 온 질문을 잊었). 건배

관련 문제