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

如何获取Django中追加生成的表单所有行数据?

解决Django多组同结构表单提交仅获取最后一行数据的问题

问题根源

你现在的问题出在重复渲染同一个表单实例,导致所有行的字段name属性都是num0、num1...,HTTP提交时同名参数会被最后一组覆盖,所以cleaned_data里只能拿到最后一行的数据。

解决方案:使用Django表单集(FormSet)

表单集是Django官方专门用来处理多组同结构表单的工具,以下是具体实现步骤:

1. 定义表单与表单集

保留原locker表单,通过formset_factory生成表单集:

from django import forms
from django.forms import formset_factory

class locker(forms.Form):
    num0 = forms.IntegerField(label='', min_value=1, max_value=25, required=True)
    num1 = forms.IntegerField(label='', min_value=1, max_value=25, required=True)
    num2 = forms.IntegerField(label='', min_value=1, max_value=25, required=True)
    num3 = forms.IntegerField(label='', min_value=1, max_value=25, required=True)
    num4 = forms.IntegerField(label='', min_value=1, max_value=25, required=True)

# 创建表单集,指定默认显示3行(可根据需求调整extra参数)
LockerFormSet = formset_factory(locker, extra=3)

2. 修改视图逻辑

分别处理GET渲染表单和POST处理提交数据:

from django.shortcuts import render

def main_view(request):
    if request.method == 'POST':
        formset = LockerFormSet(request.POST)
        if formset.is_valid():
            # 收集所有有效行的数据
            all_rows_data = []
            for form in formset:
                row_data = form.cleaned_data
                # 过滤可能的空行(如果允许用户删除行)
                if row_data:
                    all_rows_data.append(row_data)
            # 这里可以对all_rows_data进行后续处理(如存入数据库)
            print(all_rows_data)
    else:
        # GET请求时初始化表单集
        formset = LockerFormSet()
    
    return render(request, 'your_template.html', {'formset': formset})

3. 修改模板渲染

模板中循环渲染表单集,注意必须包含management_form(表单集用来识别行数的关键):

<div class="lockers">
    <form name="longForm" action="" method="post">
        {% csrf_token %}
        {{ formset.management_form }}
        {% for form in formset %}
            {{ form }}<br />
        {% endfor %}
        <br />
        <input type="submit" value="submit" class="small-button">
    </form>
</div>

4. 提交后的数据格式

验证通过后,all_rows_data会是包含所有行数据的列表,格式示例:

[
    {'num0':7, 'num1':6, 'num2':21, 'num3':5, 'num4':11},
    {'num0':22, 'num1':4, 'num2':6, 'num3':19, 'num4':10},
    {'num0':9, 'num1':14, 'num2':20, 'num3':3, 'num4':25}
]

内容的提问来源于stack exchange,提问作者itchibahn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:01:01