首页 > 解决方案 > 请求/响应中间件中的 Django 错误-TypeError: __init__() 采用 1 个位置参数,但给出了 2 个

问题描述

我对 Django 还是很陌生,似乎无法解决这个错误(我在这里阅读了类似的帖子,但没有运气)。urls.py 中的代码粘贴在下面:

from django.conf.urls import include, url
from django.contrib import admin
# Add this import
from django.contrib.auth import views
from log.forms import LoginForm

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include(('dashboard.urls', "dashboard"), namespace='dashboard')),
    url(r'^login/$', views.LoginView, {'template_name': 'login.html', 'authentication_form': LoginForm}, name='login'),
    url(r'^logout/$', views.LogoutView, {'next_page': '/'}),
]

完整跟踪如下:

Internal Server Error: /login/
Traceback (most recent call last):
  File "C:\Python36-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Python36-32\lib\site-packages\django\core\handlers\base.py", line 127, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Python36-32\lib\site-packages\django\core\handlers\base.py", line 125, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
TypeError: __init__() takes 1 positional argument but 2 were given
[21/Aug/2018 00:20:27] "GET /login/?next=/ HTTP/1.1" 500 64213

关于如何解决这个问题的任何想法?或者什么可能导致这个错误?

标签: pythondjango

解决方案


简而言之:您需要使用.as_view()将基于类的视图“转换”为可以在urls.py.

[ LoginViewDjango-doc]LogoutView[Django-doc]基于类的视图,为了使这些在 中可调用urls.py,您需要使用as_view

from django.conf.urls import include, url
from django.contrib import admin
# Add this import
from django.contrib.auth import views
from log.forms import LoginForm

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include(('dashboard.urls', "dashboard"), namespace='dashboard')),
    url(r'^login/$', views.LoginView.as_view(), {'template_name': 'login.html', 'authentication_form': LoginForm}, name='login'),
    url(r'^logout/$', views.LogoutView.as_view(), {'next_page': '/'}),
]

基于类的视图包含充当包装器的此类函数,并且每次都初始化一个实例。如果您LoginView直接使用,您将调用该类的构造函数LoginView。虽然有一些额外的逻辑,可以返回 a ,但它不是很优雅(当你构造 a 时你HttpResponse不会期望 a ),而且它会使视图子类化(这是为什么这样的类的原因之一 -基于视图可以节省很多工作)非常繁琐。HttpResponseLoginView


推荐阅读