Django视图获取表单同名字段数据并存入数据库问题
解决Django中获取多个同名字段表单数据的问题
我一眼就看出问题所在啦!你遇到的情况是因为动态添加的表单字段没有设置正确的name属性,再加上Django里获取多值字段的方式不对,导致只能拿到最后一个值。下面一步步给你解决:
问题根源
- 你第一个静态的
inicio字段用了name="inicio[]",但动态添加的inicio和fim都只用了name="inicio"、name="fim"——没有[]的话,HTTP请求里同名字段会被覆盖,只会保留最后一个的值。 - 在Django视图里,直接用
request.POST['inicio']只能拿到单值,要获取多值列表得用getlist()方法。
第一步:修正动态添加字段的name属性
把你的JavaScript代码里的name改成带[]的,同时注意不要重复使用id(HTML里id必须唯一,重复会导致JS或样式问题,这里可以去掉id或者用类选择器替代):
$(function () { var scntDiv = $('#dynamicDiv'); $(document).on('click', '#addInput', function () { // 把name改成inicio[]和fim[],去掉重复的id(改用类) $('<p>'+ '<input type="time" class="form-control form-control" name="inicio[]" style="width: 150px; margin-right: 10px;">'+ '<input type="time" class="form-control form-control" name="fim[]" style="width: 150px; margin-right: 10px;">' + '<a class="btn btn-danger" href="javascript:void(0)" class="remInput">' + '<span class="glyphicon glyphicon-minus" aria-hidden="true"></span>' + '</a><br/>'+ '</p>').appendTo(scntDiv); return false; }); // 选择器改成类.remInput,避免id重复问题 $(document).on('click', '.remInput', function () { $(this).parents('p').remove(); }); });
另外,静态的fim字段也记得改成name="fim[]",保持所有同名字段格式一致:
<input type="time" class="form-control form-control" name="fim[]" style="width: 150px;">
第二步:修改Django视图获取多值数据
用request.POST.getlist()方法获取所有的inicio和fim值,然后循环配对存入数据库:
def agenda_padrao(request): if request.method == 'POST': # 获取所有的inicio和fim列表 inicio_list = request.POST.getlist('inicio[]') fim_list = request.POST.getlist('fim[]') idempresa = request.POST['id'] # 配对遍历两个列表(假设每个inicio对应一个fim) for inicio, fim in zip(inicio_list, fim_list): # 这里写存入数据库的逻辑,比如: # Agenda.objects.create(inicio=inicio, fim=fim, idempresa=idempresa) print(f"开始时间:{inicio},结束时间:{fim}") return render(request, 'core/agenda.html')
小提示:用
zip遍历的时候要确保两个列表长度一致,如果你担心有缺失,可以加判断或者用itertools.zip_longest处理异常情况。
这样修改后,就能获取到所有动态添加的字段值啦!
内容的提问来源于stack exchange,提问作者Jhonata Rocha
相关产品推荐
相关产品推荐

