2016-11-21 5 views
4

Also habe ich die folgenden Codes für Beispiel von gefolgt von Inline-Formularsatz seines Fremdschlüssels, Beispieldetail eingerichtet. Ich habe auch ein dynamisches Feature hinzugefügt, damit Sie über Jquery weitere Zeilen für das Formset hinzufügen können. Ich habe die Jquery-Sektion von http://stackoverflow.com/questions/501719/dynamically-adding-a-form-to-a-django-formset-with-ajax. Ich habe beide Implementierungen versucht, aber es scheint das gleiche Ergebnis zu haben. Ich frage mich, ob ich etwas falsch gemacht habe.Django: dynamisches Formset mit Jquery nur erste Formset-Instanz speichern

views.py

def project_detail (request, project_id): 
    project = Project.objects.get(id = project_id) 
    sample_form = SampleForm(request.POST or None, request.FILES or None, instance = project) 
    SampleInlineFormSet = inlineformset_factory(Sample, SampleDetail, form=SampleDetailForm, extra=1, can_delete = False) 
    formset = SampleInlineFormSet(request.POST or None, request.FILES or None, prefix="nested") 
    if request.method == "POST": 

     if 'sampleform' in request.POST: 
      if sample_form.is_valid() and formset.is_valid(): 
       sample_temp = sample_form.save() 
       sample = Sample.objects.get(pk = sample_temp.pk) 
       objects = formset.save(commit=False) 
       for object in objects: 
         object.sample = sample 
         object.save() 

       messages.success(request, "Sucessfully Created New Sample Log") 
       return HttpResponseRedirect(reverse('projstatus:project_detail', args=(project_id,)))   
    context = {'project' : project, "sample_form":sample_form, 'formset' : formset} 
    return render(request, 'projstatus/detail.html', context) 

forms.py

<form method='POST' action='' enctype='multipart/form-data'>{% csrf_token %} 
      {% crispy sample_form %} 

      <div id="form_set"> 
       {{ formset.management_form }} 
       {% for form in formset.forms %} 
        <table class='no_error'> 

         {{ form.as_table }} 
        </table> 
       {% endfor %} 
      </div> 
      <input type="button" value="Add More" id="add_more"> 

      <div id="empty_form" style="display:none"> 
       <table class='no_error'> 
        {{ formset.empty_form.as_table }} 

       </table> 
      </div> 
      <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> 


       <button type='submit' class='save btn btn-default' name = 'sampleform'>Save</button>  

      </form> 

Aber ich habe dieses Problem, dass nur die erste Instanz formset jemals gespeichert wird. egal wie viele ich dynamisch einsetze. Könnte mir bitte jemand helfen?

Edit:

Das Aussehen der Form enter image description here

POST-Daten, wenn Jquery mit einer mehr Instanz (2 Instanzen insgesamt) enter image description here

POST-Daten hinzuzufügen, wenn nicht Jquery verwenden, Einstellung Extra = 2. (2 Instanzen insgesamt) enter image description here

+0

Das Problem könnte in Ihrem '# add_more' Click-Handler sein. Vergleichen Sie die Werte von "request.POST" mit und ohne Javascript (passen Sie "extra" in der Ansicht an, anstatt auf "add more" zu klicken) und stellen Sie sicher, dass Sie genau die gleichen Daten einreichen. – Alasdair

+0

@Alasdair Hallo Danke für die Kommentare. Ich habe mit POST-Daten aktualisiert. Es scheint, dass es die "undefined" Sache in Jquery Fall sein könnte, die das Problem verursacht –

+0

Ihre jQuery Post Daten fehlen 'nested-1-id',' nested-1-location' und so weiter. – Alasdair

Antwort

2

Ich denke, Ihr Problem ist mit Ihrem Javasc rip. Es scheint, dass Sie dieses Schnipsel von einem anderen Beispiel genommen haben, das herum schwebt.

var form_idx = $('#id_form-TOTAL_FORMS').val();

Damit dies funktioniert, muss es mit id von id_form-TOTAL_FORMS ein Element sein.

Aber ich denke, Ihre Form wird wahrscheinlich diese Eingabe mit einer ID von etwas wie id_nested-TOTAL_FORMS oder etwas ähnliches haben. Daher glaube ich nicht, dass Ihr Javascript tatsächlich die Verwaltungsformulardaten des Formsets aktualisiert.

Sie sollten Ihre HTML auf der Seite überprüfen und sehen, was die id dieser Eingabe ist. Verwenden Sie auch die JavaScript-Konsole, um zu sehen, was Ihr JS-Code wirklich macht.

+0

Vielen Dank! Ich habe versucht, # id_form-TOTAL_FORMS zu # id_nested-TOTAL_FORMS zu ändern und es funktioniert! –

1

Wie bei der vorherigen Antwort muss der Feldwert nested-TOTAL_FORMS bei jedem Hinzufügen einer Zeile mit der Anzahl der Zeilen aktualisiert werden. Sie aktualisieren gerade ein Feld form-TOTAL_FORMS, das nicht existiert.

Versuchen Sie, die js #id_form-TOTAL_FORMS-#id_nested-TOTAL_FORMS

Es kann auch eine Art und Weise zu aktualisieren, um die Feld-ID als Template-Variable zu erhalten, aber das entgeht mir im Moment.

+0

Vielen Dank! Ich habe versucht, # id_form-TOTAL_FORMS zu # id_nested-TOTAL_FORMS zu ändern und es funktioniert! –