Django CreateView用户注册提交后success_url触发NoneType无__dict__属性错误
问题原因与修复方案
错误根源
你重写的UserCreateForm的save方法没有返回创建的用户实例,这是触发报错的核心原因:
- Django的
ModelForm约定save方法需要返回操作完成后的模型实例,CreateView在表单校验通过后会调用form.save(),将返回值赋值给视图的self.object属性 - 你重写的
save方法没有显式设置返回值,默认返回None,导致self.object = None - 从报错栈可以看到,部署环境的Django版本执行
get_success_url逻辑时,会尝试读取self.object.__dict__对success_url做格式化插值,访问None的属性自然触发了AttributeError。
开发环境正常的原因
是开发环境和部署环境的Django版本不一致导致的表现差异:低版本Django的get_success_url逻辑仅在success_url包含{}格式化占位符时才会读取self.object的属性,你当前配置的success_url是固定路径,所以低版本下不会触发报错;而你部署环境的Django版本调整了这部分逻辑,无论是否有占位符都会执行格式化操作,因此触发了错误。
修复方案
在forms.py的save方法末尾加上返回user实例的语句即可,修改后的代码如下:
def save(self, commit = True): user = super().save(commit = False) user.first_name = self.cleaned_data['first_name'] user.last_name = self.cleaned_data['last_name'] user.email = self.cleaned_data['email'] if commit: user.save() # 新增返回实例的语句 return user
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

