auth.views.Loginview shows “__init__() got an unexpected keyword argument 'request' ”

筅森魡賤 提交于 2020-01-02 12:55:11

问题


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 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.



来源:https://stackoverflow.com/questions/51349150/auth-views-loginview-shows-init-got-an-unexpected-keyword-argument-reque

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!