Django注册功能开发报错:Model.save()收到意外关键字参数'commit'
问题修复方案
错误原因分析
- 模型
save()不支持commit参数:你在views.py的post方法里调用了new_user.save(commit=False),但CustomUser是Django模型实例,它的save()方法根本没有commit这个参数——这个参数是给ModelForm的save()方法设计的,这才是报错的直接原因。 - 表单
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
相关产品推荐
相关产品推荐

