使用login()函数登录时触发TypeError错误求助
解决Django登录视图中的TypeError: init() takes 1 positional argument but 3 were given
嘿,我来帮你搞定这个烦人的错误!你遇到的这个问题,本质是你调用的login不是Django auth模块提供的登录函数,而是一个类。当你写login(self.request, user)的时候,Python会把它当成实例化类的操作——这时候会把self.request、user加上类实例本身(隐式的self)一共三个参数传给类的__init__方法,但这个类的__init__只定义了接受自己的实例这一个参数,自然就报错啦。
具体修复步骤
1. 检查导入是否正确
先去你的accounts/views.py顶部看看,确保导入的是Django官方的登录函数:
from django.contrib.auth import login
别不小心导入了django.contrib.auth.views.LoginView还把它命名成login,那可是个类,不是函数!
2. 修正login的调用方式
在你视图的post方法里,直接用请求对象和验证后的用户对象调用login就好,写法没问题,但前提是login是正确的函数:
# 就这么写就行,前提是导入对了 login(self.request, user)
要是你用的是函数视图,那就改成login(request, user)。
3. 排查自定义代码的冲突
如果你自己写过叫login的类或者函数,赶紧给它改个名字,比如叫CustomLoginHandler之类的,别和Django内置的login重名,不然肯定会搞混。
给你个正确的示例代码片段参考
from django.contrib.auth import login from django.views.generic import FormView from .forms import LoginForm class LoginView(FormView): form_class = LoginForm template_name = 'accounts/login.html' success_url = '/' def post(self, request, *args, **kwargs): form = self.get_form() if form.is_valid(): user = form.get_user() # 这里就是正确的login调用方式 login(request, user) return self.form_valid(form) else: return self.form_invalid(form)
内容的提问来源于stack exchange,提问作者Ilham
相关产品推荐
相关产品推荐

