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

函数视图出现save() got an unexpected keyword argument 'commit'错误求解

问题原因及解决方法

错误根源

你报错的核心原因是:你用Expense.objects.create()生成的是模型实例,不是表单实例,模型的save()方法不支持commit参数——这个参数是Django表单类的save()方法特有的。而且你当前的写法完全绕开了自己定义的ExpenseForm,既没用到表单的验证逻辑,处理多对多字段debtors的方式也不对(多选情况下request.POST.get('debtors')只能拿到最后一个选中的值)。

修正后的代码

把views.py里的POST请求处理逻辑改成下面这样:

def expenseformview(request, pk):
    if request.method == 'POST':
        # 用提交的数据初始化表单
        form = ExpenseForm(request.POST)
        if form.is_valid():  # 先验证表单数据合法性
            # 保存但不提交到数据库,得到模型实例
            expense = form.save(commit=False)
            # 手动设置表单里没包含的expenser字段
            expense.expenser = request.user
            # 保存主模型实例
            expense.save()
            # 保存多对多关联数据(必须在主实例保存后调用)
            form.save_m2m()
            
            return redirect('expense_detail', pk=pk, expenseid=expense.id)
    else:
        form = ExpenseForm()
    return render(request, 'financials/expense_form.html', {'form': form})

关键改动说明

  • 直接用ExpenseForm(request.POST)接收用户提交的数据,利用表单自带的验证逻辑(比如字段类型、必填项检查),避免手动取POST数据的错误。
  • 用form.save(commit=False)生成未提交的模型实例,手动补充expenser字段后再保存主实例。
  • 调用form.save_m2m()来处理多对多字段debtors的关联,这一步必须在主模型实例保存之后执行,因为多对多关联需要主实例的主键来建立关联关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:31:02