auth.views.Loginview显示“ __init __()获得了意外的关键字参数'request'” [英] auth.views.Loginview shows "__init__() got an unexpected keyword argument 'request' "

查看:74
本文介绍了auth.views.Loginview显示“ __init __()获得了意外的关键字参数'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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆