You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:21:13