Django注册功能报错:'Profile' object is not callable 求助
解决注册时Profile对象不可调用的TypeError问题
报错信息
TypeError at /accounts/signup/
'Profile' object is not callable
核心错误原因
在forms.py的ProfileForm类中,Meta类的model属性被错误地设置为Profile()(实例化了一个Profile对象),但ModelForm要求这里传入的是模型类本身,而非类的实例。
修复步骤
1. 修正forms.py中的ProfileForm
将model = Profile()改为model = Profile:
class ProfileForm(forms.ModelForm): class Meta: model = Profile # 去掉括号,传入类本身 fields = [ "nickname", # 其他字段... ]
2. 优化views.py中的Profile创建逻辑
原代码先调用profile_form.save(commit=False)获取实例,又用Profile.objects.create重新创建,属于冗余操作。可以直接给commit=False生成的profile实例关联user后保存:
def signup(request): if request.user.is_authenticated: return redirect("review:index") if request.method == "POST": signup_form = CustomUserCreationForm(request.POST) profile_form = ProfileForm(request.POST) if signup_form.is_valid() and profile_form.is_valid(): user = signup_form.save() # 直接使用form生成的profile实例,关联user后保存 profile = profile_form.save(commit=False) profile.user = user profile.save() auth_login(request, user) return redirect("review:index") else: signup_form = CustomUserCreationForm() profile_form = ProfileForm() context = { "signup_form": signup_form, "profile_form": profile_form, } return render(request, "accounts/signup.html", context)
补充说明
- ModelForm的
model参数必须指向模型类,不能是类的实例,否则会触发"对象不可调用"的类型错误。 - 使用
commit=False生成实例后直接关联外键再保存,比重新调用objects.create更简洁,也能保留form中可能的其他字段逻辑。
内容的提问来源于stack exchange,提问作者kimsh
相关产品推荐
相关产品推荐

