django - auth.views.Loginview 显示 "__init__() got an unexpected keyword argument ' 请求'“

标签 django django-authentication

我尝试使用 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/

相关文章:

django 将模型实例转换为 dict

django - django的auth_user.username可以是varchar(75)吗?那怎么可能呢?

android - 向 Django 后端验证 Android 或 iPhone 应用程序

django - 如何让 Django View 返回表单错误

Django:密码字段 "This field is required"错误

python - Django Rest Framework 模型序列化程序 : Set all fields to read only except one

python - Django REST FRAMEWORK 中的外键关系

python - 无法在 Django 中运行 Scrapy 项目

python - 在 OSQA (django python) 上添加问题时,其正文为空

django - 如何不使用 Django 的管理员登录 View ?