函数视图出现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
相关产品推荐
相关产品推荐

