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

Django Formset验证:如何对两列数值求和并进行校验

问题分析与解决

你的代码主要有几个问题导致第二列求和失效:

  1. 循环语法错误:for form1 and form2 in formset:是无效的Python语法,formset中的每个元素是单个表单实例,不能同时迭代出两个变量。
  2. 重复实例化FormSet:你创建了两个相同的FormSet对象formbokforing和formset,完全没必要,保留一个即可。
  3. 求和逻辑混乱:你在每个修改过的表单循环里重置了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:00:10