【问题标题】:Django ModelFormset Forms Returning Empty DataDjango ModelFormset 表单返回空数据
【发布时间】: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


    【解决方案1】:

    我终于能够解决问题,这是我的问题:

    我不小心在我的其他 div 中将我的表单标记作为一个孩子,因此,动态生成的表单在提交时没有包含在表单中。

    在子标签之外获取表单后,(基本上将我的所有表单都正确包装在它下面)一切都很好。

    如果您遇到此问题,请检查检查元素以确保您的标签完全包裹您的表单,并且它没有像我的那样提前中断。

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 2013-02-01
      • 2018-02-10
      • 2012-01-09
      • 2015-01-03
      • 2019-04-23
      • 2021-01-30
      • 2010-11-15
      相关资源
      最近更新 更多