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

Django注册功能开发报错:Model.save()收到意外关键字参数'commit'

问题修复方案

错误原因分析

  1. 模型save()不支持commit参数:你在views.py的post方法里调用了new_user.save(commit=False),但CustomUser是Django模型实例,它的save()方法根本没有commit这个参数——这个参数是给ModelForm的save()方法设计的,这才是报错的直接原因。
  2. 表单save方法缩进错误:你在forms.py里写的save方法缩进错了,它被嵌套在Meta类内部,导致RegisterForm根本没正确重写save方法,等于白写了。

代码修复步骤

1. 修复forms.py的缩进与密码处理

把save方法移到Meta类外面(和Meta同级),同时注意密码必须用set_password加密,不能直接赋值:

class RegisterForm(forms.ModelForm):
    class Meta:
        model = CustomUser
        fields = ['email', 'password', 'password2']

    # 注意缩进:和Meta类同级
    def save(self, commit=True, *args, **kwargs):
        user = super(RegisterForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        # 用set_password加密密码,不能直接赋值
        user.set_password(self.cleaned_data['password'])
        if commit:
            user.save()
        return user

2. 重构views.py的post方法逻辑

没必要手动创建CustomUser实例,直接用表单的save方法处理,既符合Django规范又能避免参数错误:

def post(self, request):
    form = self.form_class(request.POST)
    if form.is_valid():
        # 调用表单的save方法,用commit=False暂不保存到数据库
        new_user = form.save(commit=False)
        new_user.is_active = False
        # 调用模型的save方法,不需要传commit参数
        new_user.save()
        activateemail(request, new_user, new_user.email)
        
        return redirect('account:user_login')

    return render(request, self.template_name, {'form': form})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:39:40