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

Django表单提交后如何简便提取request.POST内的多表单数据?

解决方案

你提交的是典型的Django表单集(Formset)标准格式数据,不需要手动遍历所有键值对解析,优先用官方原生工具处理即可:

方案1:使用Django原生Formset(推荐)

form-序号-字段名是Django表单集的默认命名规则,直接用表单集工具就能自动解析为每行独立的结构化数据,比你期望的合并格式更易用:

  1. 首先导入表单集生成工具,基于你现有的CreationForm生成表单集类:
from django.forms import formset_factory
# extra参数为默认渲染的空表单行数,如果你是前端动态生成行提交,设为0即可
CreationFormSet = formset_factory(CreationForm, extra=0)
  1. 修改视图逻辑,直接用表单集处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:45:08