Django表单提交后如何简便提取request.POST内的多表单数据?
解决方案
你提交的是典型的Django表单集(Formset)标准格式数据,不需要手动遍历所有键值对解析,优先用官方原生工具处理即可:
方案1:使用Django原生Formset(推荐)
form-序号-字段名是Django表单集的默认命名规则,直接用表单集工具就能自动解析为每行独立的结构化数据,比你期望的合并格式更易用:
- 首先导入表单集生成工具,基于你现有的
CreationForm生成表单集类:
from django.forms import formset_factory # extra参数为默认渲染的空表单行数,如果你是前端动态生成行提交,设为0即可 CreationFormSet = formset_factory(CreationForm, extra=0)
- 修改视图逻辑,直接用表单集处理POST数据:
if request.method == 'POST': formset = CreationFormSet(request.POST) if formset.is_valid(): # 直接遍历每一行的表单数据即可,无需解析键名 for single_form_data in formset.cleaned_data: # single_form_data结构为:{'country': '19389', 'city': 'Montreal', 'eid': '450', ...} # 按你的业务逻辑处理或保存即可 print(single_form_data)
注意:前端提交时需要额外加两个隐藏字段:
form-TOTAL_FORMS:值为当前提交的表单总行数(你的场景里是2)form-INITIAL_FORMS:值为初始页面渲染的表单行数,无初始行则设为0
方案2:手动转换为你期望的合并格式
如果你确实需要按字段合并的字典格式,可以用以下代码快速转换:
from collections import defaultdict merged_data = defaultdict(list) # 提取所有字段名 field_names = {k.split('-', maxsplit=2)[2] for k in request.POST if k.startswith('form-')} for field in field_names: index = 0 # 按序号从小到大依次取值存入列表 while f'form-{index}-{field}' in request.POST: merged_data[field].append(request.POST[f'form-{index}-{field}']) index += 1
转换后的merged_data就是你需要的{'country': ['19389','19390'], 'city': ['Montreal','Toronto'], ...}结构。
内容的提问来源于stack exchange,提问作者xis10z
相关产品推荐
相关产品推荐

