Django 2.2.4登录页TypeError:__init__()仅接受1个位置参数却传入2个
解决Django登录视图的TypeError: init() takes 1 positional argument but 2 were given
先来看你碰到的错误详情:
在路径/accounts/login处触发TypeError:init() takes 1 positional argument but 2 were given
请求方法:GET
请求URL:http://127.0.0.1:8000/accounts/login
Django版本:2.2.4
异常类型:TypeError
异常值:init()仅接受1个位置参数却传入2个
异常位置:E:\Python\lib\site-packages\django\core\handlers\base.py中_get_response方法,第113行
问题根源
你在项目路由里直接把auth_login(也就是LoginView类)当作视图传给了path,但Django的类视图必须通过调用as_view()方法才能转换成可处理请求的视图函数。当你直接传类的时候,Django会尝试实例化这个类并把request作为位置参数传入,可LoginView的__init__方法并不接受额外的位置参数,这就触发了这个TypeError。
顺带提一句,你的auth_logout(LogoutView类)也存在同样的问题,只是当前报错出在登录路由,后续访问登出功能也会触发类似错误。
修正后的路由代码
修改blogsite/blogsite/urls.py中的登录和登出路由,给类视图加上as_view()调用:
from django.contrib import admin from django.urls import path,include from django.contrib.auth.views import LoginView as auth_login from django.contrib.auth.views import LogoutView as auth_logout urlpatterns = [ path('admin/', admin.site.urls), path('',include('blog.urls')), # 给LoginView添加as_view()转换为可调用视图 path('accounts/login/', auth_login.as_view(), name='login'), # 给LogoutView添加as_view(),同时保留kwargs参数 path('accounts/logout/', auth_logout.as_view(), name='logout', kwargs={'next_page':'/'}) ]
额外小提示
- 我给路由路径末尾加上了
/,这符合Django的URL规范(默认APPEND_SLASH=True时,会自动重定向到带斜杠的URL),能避免不必要的重定向问题。 - 如果需要自定义登录页面模板,可以在
as_view()里传入template_name参数,比如:auth_login.as_view(template_name='registration/login.html'),这样Django就会使用你指定的模板而非默认模板。
修改完成后,访问/accounts/login/就不会再触发TypeError了,登出功能也能正常运行。
内容的提问来源于stack exchange,提问作者Parekh Akhil
相关产品推荐
相关产品推荐

