Django1.11+Python3.6.5用户注册表单报错:__init__()参数不匹配
解决Django类视图的
__init__() takes 1 positional argument but 2 were given错误 嘿,我一眼就揪出问题所在了——你的URL配置犯了类视图的典型错误!
错误核心原因
看你的URL代码:
url(r'^register/$', views.User_accountFormView, name='register'),
你直接把User_accountFormView这个类传给了url函数,但Django的类视图不能这么用!它需要调用as_view()方法来生成一个能处理请求的视图函数。当请求过来时,Django会尝试直接调用这个类,而不是它的实例,这就导致了参数不匹配——类的__init__不需要额外参数,但Django会自动传入request等参数,所以就触发了这个报错。
快速修复方案
把URL里的代码改成这样,加上as_view()方法调用:
url(r'^register/$', views.User_accountFormView.as_view(), name='register'),
额外避坑提示
除了这个核心错误,还有几个地方能帮你避免后续麻烦:
- 检查Address模型:你的
User_account模型里有外键关联Address,但没给出这个模型的代码,一定要确保它已经在models.py里正确定义,不然会出现模型找不到的错误。 - 密码安全优化:当前表单的密码是明文输入和存储的,风险很高。建议给密码字段添加隐藏输入组件,并且存储时哈希密码:
- 修改表单代码:
class User_accountForm(forms.ModelForm): # 新增密码输入组件,隐藏明文 password = forms.CharField(widget=forms.PasswordInput) class Meta: model = User_account fields = ['first_name', 'last_name', 'user_name', 'email', 'password', 'address'] - 补充视图的POST处理逻辑(记得导入哈希工具):
from django.contrib.auth.hashers import make_password def post(self, request, *args, **kwargs): form = self.form_class(request.POST) if form.is_valid(): user = form.save(commit=False) # 对密码进行哈希处理再存储 user.password = make_password(user.password) user.save() return redirect('index') # 注册成功后跳转首页 return render(request, self.template_name, {'form': form})
- 修改表单代码:
- 命名规范优化:Python类名通常用驼峰命名法,比如
UserAccount代替User_account,UserAccountForm代替User_accountForm,这样代码可读性更强。
按照上面的步骤修改后,你的注册功能应该就能正常跑起来了!
内容的提问来源于stack exchange,提问作者Saleh
相关产品推荐
相关产品推荐

