2017-02-21 22 views
0

Я слежу за этим tutorial, а часть дублирования/удаления формы отлично работает, но сохраняется только первая форма. Из формы data, я знаю, что значения существуют, а также то, что form-TOTAL_FORMS должно быть 2 (или сколько угодно) вместо 1. Я предполагаю, что поэтому geo_form.cleaned_data не содержит никакой второй формы. Я предполагаю, что если form-TOTAL_FORMS соответствует, тогда все данные формы будут там. Если это так, как мне изменить форму управления? Если есть другое решение, как бы это сделать?Динамическое добавление форм в формсет, не сохраняющих/Руководство по обновлению руководства вручную?

(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

Чтобы иметь несколько FormSets в одной точке зрения, вам нужно для установки префиксного параметра (see docs) при создании экземпляра набора форм. В противном случае возникает конфликт имен.

i.e. 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> 

 Смежные вопросы

  • Нет связанных вопросов^_^