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:
POST-Daten, wenn Jquery mit einer mehr Instanz (2 Instanzen insgesamt)
POST-Daten hinzuzufügen, wenn nicht Jquery verwenden, Einstellung Extra = 2. (2 Instanzen insgesamt)
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
@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 –
Ihre jQuery Post Daten fehlen 'nested-1-id',' nested-1-location' und so weiter. – Alasdair