一段时间以来,我一直在关注各种教程,并试图将它们理解/组合在一起,以使用户能够在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的信息有问题?
在此先感谢您的帮助。
答案 0 :(得分:0)
找到了!
JavaScript正在更新错误的TOTAL_FORMS。代替id_TOTAL_FORMS,它应该是id_employeeshift_TOTAL_FORMS。
我将留作参考,因为这段javascript是从一个非常老的堆栈溢出答案中提取的,其他人可能会遇到相同的问题。