我尝试使用 djangos 内置 LoginView
,但显示错误:
__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'
)
这是错误:
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'
最佳答案
显然,LoginView
使用 djangos AuthenticationForm
作为其默认值。该表单的文档说:
Takes
request
as its first positional argument, ...
这意味着 LoginView
会将 request
作为参数传递给您的表单。 Django 的默认 forms.Form
并不期望这样(查看源代码 here )。
因此,您可以尝试重写 __init__()
方法以允许额外的参数:
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)
让我们知道进展如何。
关于django - auth.views.Loginview 显示 "__init__() got an unexpected keyword argument ' 请求'“,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51349150/