如何获取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
相关产品推荐
相关产品推荐

