【发布时间】:2021-04-03 08:10:27
【问题描述】:
我已经尝试解决这个问题数周无济于事,非常感谢一些帮助。
背景
我正在创建一个 Django 应用程序,它接受用户的教育经验输入,并希望为用户提供通过“添加更多”按钮添加新体验的能力(即,如果他们有本科和硕士)。
我正在使用 ModelFormsets 和 Jquery 执行此操作,遵循以下答案:Dynamically adding a form to a Django formset with Ajax。
问题 在访问表单集的cleaned_data时,只有第一个初始表单在其cleaned_data中有值,额外生成的表单返回一个空字典,其中没有清理数据。
Views.py
EducationFormset = modelformset_factory(Education, form=EducationForm, fields=('institution', 'degree', 'major', 'major_start_date', 'major_end_date', 'major_description', 'gpa',))
if request.method == 'POST':
formset = EducationFormset(request.POST, request.Files)
if formset.is_valid():
formset.save()
for form in formset.forms:
print(form.cleaned_data)
else:
print(formset.errors)
else:
formset = EducationFormset(queryset=Education.objects.none())
context = {
'user_form': user_form,
'education_form': education_form,
'experience_form': experience_form,
'formset':formset,
}
return render(request, 'create.html', context)
HTML
{{ formset.management_form }}
<div id="form_set">
<div class="form-group">
{% for form in formset.forms %}
{{form.errors}}
<table class="no_error">
{{form.as_table}}
</table>
{% endfor %}
</div>
</div>
<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>
Models.py
class Education(models.Model):
institution = models.CharField(max_length = 120, blank=True)
degree = models.CharField(max_length = 120, blank=True)
major = models.CharField(max_length = 120, blank=True)
major_start_date = models.CharField(max_length = 120, blank=True)
major_end_date = models.CharField(max_length = 120, blank=True)
gpa = models.CharField(max_length = 120, blank=True)
major_description = models.CharField(max_length = 120, blank=True)
【问题讨论】:
标签: django django-models django-views django-forms django-templates