问题
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'
回答1:
Aparently, the LoginView uses djangos AuthenticationForm as its default. The docs for that form say:
Takes
requestas 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.
来源:https://stackoverflow.com/questions/51349150/auth-views-loginview-shows-init-got-an-unexpected-keyword-argument-reque