2017-02-21 3 views
0

私はtutorialをフォローしていますが、フォームの複製/削除部分はうまくいきますが、最初のフォームのみ保存されます。 formsetのdataから、私は値が存在することを知っているだけでなく、form-TOTAL_FORMSは2ではなく、1よりも多くなければならないことを知っています。これはgeo_form.cleaned_dataに第2の形式が含まれていないと仮定していると仮定しています。私は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 %} 

注:私はあなたが必要とする、1つのビューで複数のフォームセットを持っているために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> 
関連する問題