求助:如何在Django中通过POST批量添加多条记录?
Django批量添加记录问题修复方案
问题核心错误
你的代码存在3个关键问题导致批量添加失效:
- 表单循环生成的输入框共用相同
name,提交后仅能获取最后一行的值,无法收集所有行数据 - 视图中错误获取不存在的
post_list[]参数,且直接对字符串调用save()方法(完全不符合Django模型操作逻辑) Master_data.objects.all().values()属于冗余代码,未对流程产生任何作用
修正后的代码实现
1. 表单模板(form.html)
将输入框name改为数组格式,确保能收集所有行的输入值:
<form action="" method="POST"> {% csrf_token %} {% for work_stations in ws %} {% if work_stations.is_active %} <div class="row"> <div class="col"> <input type="text" class="form-control" placeholder="work stations1" aria-label="" name="ws1[]"> </div> <div class="col"> <input type="text" class="form-control" placeholder="work stations2" aria-label="" name="ws2[]"> </div> </div> {% endif %} {% endfor %} <input type="submit"> </form>
2. 视图函数(views.py)
正确获取表单数组数据,循环创建并保存Master_data实例:
from django.shortcuts import render from .models import Master_data def createpost(request): if request.method == 'POST': # 获取所有行的ws1和ws2输入值 ws1_list = request.POST.getlist('ws1[]') ws2_list = request.POST.getlist('ws2[]') # 配对每行数据,批量创建记录 for ws1, ws2 in zip(ws1_list, ws2_list): # 可选:跳过空行(根据业务需求调整) if ws1 or ws2: Master_data.objects.create(ws1=ws1, ws2=ws2) return render(request, 'main/cretedata.html') else: # GET请求时需传递ws数据到模板,否则表单循环无渲染内容 # 示例:替换为你的工作台模型查询逻辑 # ws = WorkStation.objects.all() return render(request, 'main/form.html', {'ws': ws})
优化建议
- 若需校验输入数据,推荐使用Django表单类(
forms.Form/forms.ModelForm),简化验证逻辑 - 数据量较大时,用
bulk_create提升性能:objects_to_create = [] for ws1, ws2 in zip(ws1_list, ws2_list): if ws1 or ws2: objects_to_create.append(Master_data(ws1=ws1, ws2=ws2)) Master_data.objects.bulk_create(objects_to_create)
内容的提问来源于stack exchange,提问作者Nike
相关产品推荐
相关产品推荐

