auth.views.Loginview显示“ __init __()获得了意外的关键字参数'request'” [英] auth.views.Loginview shows "__init__() got an unexpected keyword argument 'request' "
问题描述
我正尝试使用内置的djangos LoginView
,但显示错误:
__ init __()有一个意外的关键字参数'request'
来自django.urls的
的batchbook / user / urls.py 从django.contrib导入路径
。 auth.views从django.shortcuts导入LoginView,LogoutView
从.forms导入反向
导入LoginForm
app_name ='user'
urlpatterns = [
路径(
'login',
LoginView.as_view(
authentication_form = LoginForm,
success_url ='/',
template_name ='user / login.html') ,
name ='login'),
path(
'logout',
LogoutView.as_view(template_name ='user / logout.html'),
名称='logout'),
]
batchbook / batchbook / urls.py
urlpatterns = [
path('a dmin /',admin.site.urls),
路径('user /',include(auth_urls)),
re_path(
'^ $',
TemplateView.as_view (template_name ='site / index.html'),
name ='index'),
]
forms.py
从Django导入表单
从.validators导入usn_validator
类LoginForm(forms.Form):
usn = forms.CharField(
max_length = 11,
validators =(usn_validator,),
小部件= forms.TextInput(attrs = {
'class':'form-control'
})
)
password = forms.CharField(
widget = forms.PasswordInput(attrs = {
'class':'form-control'
})
)
validators.py
usn_validator = RegexValidator(
regex ='^ 1BM [0-9] {2} [AZ] {2,3} [0-9] {3} $',
message ='请输入正确的USN',
code ='usn_err'
)
这里是错误:
环境:
请求方法:GET
请求URL:http://127.0.0.1 :8000 / user / login
Django版本:2.0.5
Python版本:3.6.6
已安装的应用程序:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user']
已安装中间件:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions .middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware'
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
追溯:
文件 C:\用户 bhask Miniconda3 envs batchbook lib站点软件包 django核心 handlers exception.py位于内部
35中。response = get_response(request)
文件 C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\core\handlers\base.py在_get_response
128中。response = self.process_exception_by_middleware(e,request)
File C:\Users\bhask\Miniconda3\envs\batchbook\lib\ _get_response
126中的site-packages\django\core\handlers\base.py。response = wrap_callback(request,* callback_args,** callback_kwargs)
文件 C :在视图
中,\用户\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\views\generic\base.py。返回自身。 dispatch(request,* args,** kwargs)
文件 C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\ _wrapper
62中的 utils\decorators.py。return bound_func(* args,** kwargs)
文件 C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\views\decorators\debug.py 76. return view(request,* args,** kwargs)
File C:\Users\bhask\Miniconda3\envs\batchbook\lib 58. return func .__ get __(self,type(self))(* args2,** kwargs2)
$返回 func_func
中的 site-packages django utils decorators.py。 b $ b文件_wrapper
62中的 C:\Users\hask\Miniconda3\envs\batchbook\lib\site-packages\django\utils\decorators.py。返回bound_func(* args,** kwargs)
文件 C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\ utils\decorators.py在_wrapped_view
142中。response = view_func(request,* args,** kwargs)
文件 C:\Users\bhask\Miniconda3\ envs\batchbook\lib\site-packagesdjango\utils\decorators.py在bound_func
58中。return func .__ get__ (self,type(self))(* args2,** kwargs2)
文件 C:\Users\bhask\Miniconda3\envs\batchbook\lib\site- _wrapper
62中的package\django\utils\decorators.py。return bound_func(* args,** kwargs)
文件 C:\Users\bhask\ _miniconda3\envs\batchbook\lib\site-packages\django\views\decorators\cache.py in _wrapped_view_func
44. response = view_func(request,* args,** kwargs)
文件 C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\utils\decorators.py中bound_func
58. return func .__ get __(self,type(self))(* args2,** kwargs2)
文件 C:\Users\bhask\Miniconda3\ envs\batchbook\lib\site-packages\django\contrib\auth\views.py在调度
66中。return super()。dispatch(request,* args,** kwargs )
文件 C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\views\generic\base.py 在发运
89中。 ler(request,* args,** kwargs)
文件 C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\ \views\generic\edit.py,获得
133。return self.render_to_response(self.get_context_data())
文件 C:\Users\bhask\ miniconda3\envs\batchbook\lib\site-packages\django\contrib\auth\views.py in get_context_data
99。context = super()。get_context_data(** kwargs)
文件 C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\views\generic\edit.py在get_context_data
66中。kwargs ['form'] = self.get_form()
文件 C:\Users\bhask\Miniconda3\envs\batchbook\lib get_form
中的 site-packages django views generic edit.py。33. return form_class(** self.get_form_kwargs())
异常类型: / user / login
处的TypeError异常值:__init __()获得了意外的关键字参数'request'
显然, LoginView
使用djangos AuthenticationForm
作为默认设置。该表单的文档说:
将
request
作为其第一个位置参数, ...
这意味着 LoginView
将通过 request
作为表单的参数。 Django的默认 forms.Form
并不期望这样(请查看源代码此处)。
因此,您可以尝试覆盖 __ init__ ()
方法以允许该额外参数:
class LoginForm(forms.Form):
usn = forms.CharField ...
密码= forms.CharField ...
def __init __(self,request,* args,** kwargs):
#只是不要将'request'传递给父
super()。__init __(* args,** kwargs)
让我们知道怎么回事。
I am trying to use djangos built-in LoginView
, but it showed an error:
__init__() got an unexpected keyword argument 'request'
batchbook/user/urls.py
from django.urls import path
from django.contrib.auth.views import LoginView, LogoutView
from django.shortcuts import reverse
from .forms import LoginForm
app_name = 'user'
urlpatterns = [
path(
'login',
LoginView.as_view(
authentication_form=LoginForm,
success_url='/',
template_name='user/login.html'),
name='login'),
path(
'logout',
LogoutView.as_view(template_name='user/logout.html'),
name='logout'),
]
batchbook/batchbook/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('user/', include(auth_urls)),
re_path(
'^$',
TemplateView.as_view(template_name='site/index.html'),
name='index'),
]
forms.py
from django import forms
from .validators import usn_validator
class LoginForm(forms.Form):
usn = forms.CharField(
max_length=11,
validators = (usn_validator,),
widget = forms.TextInput(attrs={
'class': 'form-control'
})
)
password = forms.CharField(
widget=forms.PasswordInput(attrs={
'class': 'form-control'
})
)
validators.py
usn_validator = RegexValidator(
regex='^1BM[0-9]{2}[A-Z]{2,3}[0-9]{3}$',
message='Please enter correct USN',
code='usn_err'
)
Here is the error:
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/user/login
Django Version: 2.0.5
Python Version: 3.6.6
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\core\handlers\exception.py" in inner
35. response = get_response(request)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\core\handlers\base.py" in _get_response
128. response = self.process_exception_by_middleware(e, request)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\core\handlers\base.py" in _get_response
126. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\views\generic\base.py" in view
69. return self.dispatch(request, *args, **kwargs)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\utils\decorators.py" in _wrapper
62. return bound_func(*args, **kwargs)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\views\decorators\debug.py" in sensitive_post_parameters_wrapper
76. return view(request, *args, **kwargs)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\utils\decorators.py" in bound_func
58. return func.__get__(self, type(self))(*args2, **kwargs2)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\utils\decorators.py" in _wrapper
62. return bound_func(*args, **kwargs)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\utils\decorators.py" in _wrapped_view
142. response = view_func(request, *args, **kwargs)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\utils\decorators.py" in bound_func
58. return func.__get__(self, type(self))(*args2, **kwargs2)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\utils\decorators.py" in _wrapper
62. return bound_func(*args, **kwargs)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func
44. response = view_func(request, *args, **kwargs)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\utils\decorators.py" in bound_func
58. return func.__get__(self, type(self))(*args2, **kwargs2)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\contrib\auth\views.py" in dispatch
66. return super().dispatch(request, *args, **kwargs)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\views\generic\base.py" in dispatch
89. return handler(request, *args, **kwargs)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\views\generic\edit.py" in get
133. return self.render_to_response(self.get_context_data())
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\contrib\auth\views.py" in get_context_data
99. context = super().get_context_data(**kwargs)
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\views\generic\edit.py" in get_context_data
66. kwargs['form'] = self.get_form()
File "C:\Users\bhask\Miniconda3\envs\batchbook\lib\site-packages\django\views\generic\edit.py" in get_form
33. return form_class(**self.get_form_kwargs())
Exception Type: TypeError at /user/login
Exception Value: __init__() got an unexpected keyword argument 'request'
Aparently, the LoginView
uses djangos AuthenticationForm
as its default. The docs for that form say:
Takes
request
as its first positional argument, ...
That means that LoginView
will pass request
as an argument to your form. Djangos default forms.Form
does not expect that (look at the source here).
So you can try to override your __init__()
method to allow that extra argument:
class LoginForm(forms.Form):
usn = forms.CharField...
password = forms.CharField...
def __init__(self, request, *args, **kwargs):
# simply do not pass 'request' to the parent
super().__init__(*args, **kwargs)
Let us know how that goes.
这篇关于auth.views.Loginview显示“ __init __()获得了意外的关键字参数'request'”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!