簡體   English   中英

__init__() 缺少 1 個必需的位置參數:擴展 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'})

同樣,以下是我將為幾乎所有相關視圖類擴展的基本管理視圖。

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相關的操作 object 在您進入view中的GET/POST等請求方法處理程序之前,在幕后,在__init__()方法中,您沒有收到任何request object ,因為您可以查看是否將*args**kwargs添加到init ,您的視圖類中有空。

不應該覆蓋__init__() 請求 object 首先在 dispatch() 方法中可用,該方法在__init__()之后立即調用,但您也不需要覆蓋該方法。 它的主要目的是調用get()post()或其他相關的方法處理程序。 然而,一般來說,也沒有必要覆蓋這些。

但是,如果您確實必須盡可能早地捕獲請求,那么調度方法是您最好的選擇。

您的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'})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM