__init__() 缺少 1 个必需的位置参数:'request' 扩展 class 时父构造函数错误
__init__() missing 1 required positional argument: 'request' parent constructor error while extending class
我正在尝试从我的自定义管理部分的 baseView 扩展基于 class 的视图。
以下是仪表板部分的视图。
class Dashboard(BaseAdminView):
def __init__(self, request):
super().__init__(request)
def get(self, request):
return render(request, 'admin/pages/dashboard.html', {'hello': 'World'})
同样,以下是基本管理视图,我将扩展它以用于几乎所有相关视图 classes。
class BaseAdminView(View):
loggedInUser = None
def __init__(self, request):
if (request.session['loggedInAdministrator'] is None):
return redirect('adminlogin')
else:
loggedInUser = request.session['loggedInAdministrator']
我的问题是,当我尝试访问控制面板时,控制台出现 __init__() missing 1 required positional argument: 'request'
错误。
不是 self
然后 request
这里变量的顺序还是我遗漏了什么。我也删除了 self
问题仍然是一样的。如果我选择不使用请求变量,虽然构造函数可以正常工作,但使用会话是我唯一需要的,我首先要这样做。
我该怎么做?如何访问父 class 中的请求??
我也看到了
def __init__(self, request):
super().__init__(request)
仪表板中的这段代码是不必要的,因为即使我删除了它,基础构造函数也会被调用。这是它的工作原理吗?语言和框架的童话新手..
添加:urls.py
在相关应用中
urlpatterns = [
path('', views.Dashboard.as_view(), name='adminhome'),
path('login', views.Login.as_view(), name='adminlogin'),
path('logout', views.Logout.as_view(), name='adminlogout')
]
根据您的问题,您需要实施一些与 request
对象相关的操作 在您进入 view
中的请求方法处理程序之前,在幕后,在__init__()
方法你没有收到任何 request object
,你可以看到如果你添加 *args
和 **kwargs
到 init,那里在您看来是空的 classes.
您不应该覆盖 __init__()
。请求对象首先在 dispatch() 方法中可用,该方法在 __init__()
之后立即调用,但您也不需要重写该方法。其主要目的是调用 get()
、post()
或其他相关方法处理程序。但是,一般来说,也没有必要覆盖它们。
如果你真的绝对必须尽早捕获请求,那么 dispatch 方法是你最好的选择。
您的 BaseAdminView
class 看起来像这样:
class BaseAdminView(View):
loggedInUser = None
def dispatch(self, request, *args, **kwargs):
if request.session['loggedInAdministrator'] is None:
return redirect('adminlogin')
else:
self.loggedInUser = request.session['loggedInAdministrator']
return super().dispatch(request, *args, **kwargs)
和 Dashboard
class 看起来像这样:
class Dashboard(BaseAdminView):
def get(self, request):
return render(request, 'admin/pages/dashboard.html', {'hello': 'World'})
我正在尝试从我的自定义管理部分的 baseView 扩展基于 class 的视图。 以下是仪表板部分的视图。
class Dashboard(BaseAdminView):
def __init__(self, request):
super().__init__(request)
def get(self, request):
return render(request, 'admin/pages/dashboard.html', {'hello': 'World'})
同样,以下是基本管理视图,我将扩展它以用于几乎所有相关视图 classes。
class BaseAdminView(View):
loggedInUser = None
def __init__(self, request):
if (request.session['loggedInAdministrator'] is None):
return redirect('adminlogin')
else:
loggedInUser = request.session['loggedInAdministrator']
我的问题是,当我尝试访问控制面板时,控制台出现 __init__() missing 1 required positional argument: 'request'
错误。
不是 self
然后 request
这里变量的顺序还是我遗漏了什么。我也删除了 self
问题仍然是一样的。如果我选择不使用请求变量,虽然构造函数可以正常工作,但使用会话是我唯一需要的,我首先要这样做。
我该怎么做?如何访问父 class 中的请求??
我也看到了
def __init__(self, request):
super().__init__(request)
仪表板中的这段代码是不必要的,因为即使我删除了它,基础构造函数也会被调用。这是它的工作原理吗?语言和框架的童话新手..
添加:urls.py
在相关应用中
urlpatterns = [
path('', views.Dashboard.as_view(), name='adminhome'),
path('login', views.Login.as_view(), name='adminlogin'),
path('logout', views.Logout.as_view(), name='adminlogout')
]
根据您的问题,您需要实施一些与 request
对象相关的操作 在您进入 view
中的请求方法处理程序之前,在幕后,在__init__()
方法你没有收到任何 request object
,你可以看到如果你添加 *args
和 **kwargs
到 init,那里在您看来是空的 classes.
您不应该覆盖 __init__()
。请求对象首先在 dispatch() 方法中可用,该方法在 __init__()
之后立即调用,但您也不需要重写该方法。其主要目的是调用 get()
、post()
或其他相关方法处理程序。但是,一般来说,也没有必要覆盖它们。
如果你真的绝对必须尽早捕获请求,那么 dispatch 方法是你最好的选择。
您的 BaseAdminView
class 看起来像这样:
class BaseAdminView(View):
loggedInUser = None
def dispatch(self, request, *args, **kwargs):
if request.session['loggedInAdministrator'] is None:
return redirect('adminlogin')
else:
self.loggedInUser = request.session['loggedInAdministrator']
return super().dispatch(request, *args, **kwargs)
和 Dashboard
class 看起来像这样:
class Dashboard(BaseAdminView):
def get(self, request):
return render(request, 'admin/pages/dashboard.html', {'hello': 'World'})