Django Formset验证:如何对两列数值求和并进行校验
问题分析与解决
你的代码主要有几个问题导致第二列求和失效:
- 循环语法错误:
for form1 and form2 in formset:是无效的Python语法,formset中的每个元素是单个表单实例,不能同时迭代出两个变量。 - 重复实例化FormSet:你创建了两个相同的FormSet对象
formbokforing和formset,完全没必要,保留一个即可。 - 求和逻辑混乱:你在每个修改过的表单循环里重置了
total为0,并且重复遍历formset,这会导致计算结果错误,甚至提前返回。
修正后的代码
from django.http import HttpResponse def bokforing(request): InnslagFormSet = formset_factory(form=InnslagForm, extra=3) if request.method == 'POST': formset = InnslagFormSet(request.POST) if formset.is_valid(): total = 0 # 遍历所有有效表单,累加两列数值 for form in formset: # 处理可能的空值,避免KeyError或类型错误 debet = form.cleaned_data.get("innslagDebet", 0) kredit = form.cleaned_data.get("innslagKredit", 0) total += debet + kredit # 若需求是累加过程中达到500就立即返回,保留此判断;否则移到循环外 # if total == 500: # return HttpResponse("Valid") # 若需求是所有表单的两列总和等于500,用此判断 if total == 500: return HttpResponse("Valid") # 处理表单保存逻辑 for form in formset: if form.has_changed(): form.save(commit=False) # 可添加保存前的额外操作,比如关联外键等 form.save() # GET请求或表单无效时的初始化逻辑 else: formset = InnslagFormSet() return render(request, 'your_template.html', {'formset': formset})
关键修改点
- 移除重复的FormSet实例化,只保留一个
formset对象。 - 用
cleaned_data.get()方法获取字段值,避免字段为空时抛出异常,默认值设为0保证数值计算正常。 - 将总和计算放在外层循环,确保所有表单的两列数值都被正确累加。
- 拆分求和逻辑与表单保存逻辑,避免两者互相干扰。
内容的提问来源于stack exchange,提问作者Mgb123
相关产品推荐
相关产品推荐

