2017-02-21 82 views
0

我一直在关注这个tutorial,而表单复制/删除部分很好,但唯一的第一种形式被保存。从formset的data,我知道存在的值以及form-TOTAL_FORMS应该是2(或者很多)而不是1.我认为这就是为什么geo_form.cleaned_data不包含任何第二种形式。我假设如果form-TOTAL_FORMS匹配,那么所有的表单数据都会在那里。如果这是正确的,我如何更新管理表单?如果有另一种解决方案,我将如何制定?在formset中动态添加表单不保存/管理表单手动更新?

(Pdb) for k, v in geo_formset.data.items(): print k, v 
form-0-tables test1, test2, test3 
form-0-name Shelburne, Burlington, Rutland 
form-1-state OR 
outfile x.xlsx 
form-MAX_NUM_FORMS 1000 
form-0-survey ACS1 
form-1-name Washington, Clackamas 
form-TOTAL_FORMS 1 
form-0-years 2000 
form-MIN_NUM_FORMS 0 
form-INITIAL_FORMS 0 
form-1-region county 
form-0-state VT 
form-0-region place 

下面是视图:

class Start(View): 

    def get(self, request): 
     GeoFormset = formset_factory(GeographyForm) 
     CensusFormset = formset_factory(forms.CensusForm) 
     geo_formset = GeoFormset() 
     cen_formset = CensusFormset() 
     out_form = forms.OutfileForm() 
     return render(
      request, 
      'start.html', 
      { 
       'geo_formset': geo_formset, 
       'cen_formset': cen_formset, 
       'out_form': out_form 
      } 
     ) 

    def post(self, request): 
     GeoFormset = formset_factory(GeographyForm, min_num=1, validate_min=True, extra=0) 
     CensusFormset = formset_factory(forms.CensusForm, min_num=1, validate_min=True, extra=0) 
     geo_formset = GeoFormset(request.POST) 
     cen_formset = CensusFormset(request.POST) 
     out_form = forms.OutfileForm(request.POST) 
     if geo_formset.is_valid() and out_form.is_valid() and cen_formset.is_valid(): 
      import pdb; pdb.set_trace() 
      return HttpResponseRedirect(reverse('completed')) 
     else: 
      return render(
       request, 
       'start.html', 
       { 
        'geo_formset': geo_formset, 
        'cen_formset': cen_formset, 
        'out_form': out_form 
       } 
      ) 

和模板

{% extends "base.html" %} 

{% block body %} 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> 

    <form method="post" action="">{% csrf_token %} 
    {{cen_formset.management_form}} 
    {% for cen_form in cen_formset.forms %} 
     <fieldset> 
     <div class="census-formset"> 
      Select a survey: {{ cen_form.survey }} | {{ cen_form.tables }}<br> 
      {{ cen_form.years }} 
     </div> 
     </fieldset> 
    {% endfor %} 
    <br> 
    {{geo_formset.management_form}} 
    {% for geo_form in geo_formset %} 
     <fieldset> 
     <div class="geo-formset"> 
      {{ geo_form.as_p }} 
     </div> 
     </fieldset> 
    {% endfor %} 
    <br> 
    <fieldset> 
     {{ out_form.as_p }} 
    </fieldset> 

    <input type="submit" value="OK"> 
    </form> 

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.formset/1.2.2/jquery.formset.min.js"></script> 
    <style type="text/css"> 
    .remove_text{ 
     clear: left; 
     color: red; 
    } 
    </style> 
    <script type="text/javascript"> 
    $('.census-formset').formset({ 
     addText: 'add census', 
     deleteText: 'remove', 
     deleteCssClass: 'remove_text', 
    }); 
    $('.geo-formset').formset({ 
     addText: 'add regions', 
     deleteText: 'remove', 
     deleteCssClass: 'remove_text', 
    }); 
</script> 
{% endblock %} 

注:我使用Django 1.10.5

回答

1

若要在一个视图中的多个表单集,你需要在实例化formset时设置前缀参数(see docs)。否则会出现命名冲突。

geo_formset = GeoFormset(request.POST)将是geo_formset = GeoFormset(request.POST, prefix='geo'),并且对于CensusFormset也是类似的。

0

我打算接受@neomaic的答案,因为它让我接受了正确的答案。除了将prefix添加到我的套件之外,我还必须更新JQuery

<script type="text/javascript"> 
    $('.census-formset').formset({ 
     prefix: "{{cen_formset.prefix}}", 
     addText: 'add census', 
     deleteText: 'remove', 
     deleteCssClass: 'remove_text', 
    }); 
    $('.geo-formset').formset({ 
     prefix: "{{geo_formset.prefix}}", 
     addText: 'add regions', 
     deleteText: 'remove', 
     deleteCssClass: 'remove_text', 
    }); 
</script>