动态添加的表单未保存到inlineformset_factory Django

时间:2019-03-11 20:56:16

标签: django formset

一段时间以来,我一直在关注各种教程,并试图将它们理解/组合在一起,以使用户能够在inlineformset_factory中向孩子动态添加实例。

我的项目是一个简单的员工/轮班设置。我的父级模型是经理在一天结束时完成的 ManagerChecklist 模型。子模型是 EmployeeShift 模型,其中包含进行该轮班工作的每个员工的信息以及他们工作的时间。我希望经理能够将员工动态添加到他的“经理清单”表单中。

views.py

def update_manager_checklist(request, date):
    template_name = 'shifts/checklists/manager_checklist_update.html'
    instance = get_object_or_404(ManagerChecklist, shift__shift_date=date)
    checklist = inlineformset_factory(ManagerChecklist, EmployeeShift,
                                      fields=('employee', 'start_time',
                                              'end_time', 'total_hours_worked',
                                            ),
                                      extra=0, max_num=None)
    if request.method == 'POST':
        formset = checklist(request.POST, instance=instance)
        if formset.is_valid():
            formset.save()
            return redirect('shifts:shift_list')

    formset = checklist(instance=instance)
    return render(request, template_name, {
        'formset': formset,
    })

html:

{{ formset.management_form }}
<div id="form_set">
    {% for form in formset %}
        <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>

javascript:

<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>

JavaScript可以很好地将外观直观地添加到页面中-但是这些表单没有经过验证或添加,或者显然没有发送到views.py。如果我更新现有表单或使用extra = 1而不是extra = 0创建一个额外的员工轮班,那么它将正确地进行验证并添加。

我假设需要在我的views.py中添加一些代码,以便它可以拾取正在动态添加的formset.empty_form?也许javascript发送到django的信息有问题?

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

找到了!

JavaScript正在更新错误的TOTAL_FORMS。代替id_TOTAL_FORMS,它应该是id_employeeshift_TOTAL_FORMS。

我将留作参考,因为这段javascript是从一个非常老的堆栈溢出答案中提取的,其他人可能会遇到相同的问题。