Django注册视图报错:TypeError: 'UserProfileInfoForm'对象不可调用
解决Django注册视图中的"UserProfileInfoForm对象不可调用"错误
嘿,我一眼就发现问题啦!这个错误是表单保存环节的小失误,咱们快速把它搞定:
错误原因拆解
在你的register视图里,当表单验证通过后,你已经实例化出了profile_form这个表单对象,但接下来你写了:
profile = profile_form(commit=False)
这里的profile_form已经是一个表单实例,不是表单类本身,所以不能像调用函数那样去执行它。正确的姿势是调用表单实例的save()方法,传入commit=False参数来推迟数据库提交。
核心修复步骤
把那行错误代码替换成:
profile = profile_form.save(commit=False)
另外我还注意到一个小拼写bug:返回模板上下文的时候,你写了'resigtered': registered,键名少了个t,应该改成'registered': registered,不然模板里可能没法正确获取注册成功的状态哦。
修复后的完整register视图代码
from django.shortcuts import render from practise.forms import UserForm, UserProfileInfoForm def index(request): return render(request, 'index.html') def register(request): registered = False if request.method == 'POST': user_form = UserForm(data=request.POST) profile_form = UserProfileInfoForm(data=request.POST) if user_form.is_valid() and profile_form.is_valid(): user = user_form.save() user.set_password(user.password) user.save() # 修复的核心代码 profile = profile_form.save(commit=False) profile.user = user if 'profile_pic' in request.FILES: profile.profile_pic = request.FILES['profile_pic'] profile.save() registered = True else: print(user_form.errors, profile_form.errors) else: user_form = UserForm() profile_form = UserProfileInfoForm() # 修复拼写错误的上下文键名 return render(request, 'registration.html', {'user_form': user_form, 'profile_form': profile_form, 'registered': registered})
修改完成后,你的注册接口应该就能正常处理POST请求,不会再抛出500内部服务器错误啦~
内容的提问来源于stack exchange,提问作者Mohamed Faris
相关产品推荐
相关产品推荐

