2013-07-21 77 views
1

我正在將一些Django視圖轉換爲基於類,並且迄今爲止熱愛這種靈活性。Django基於類的視圖功能執行順序

我的大部分視圖子類都是父視圖ClubView。每個需要處理post()方法覆蓋的子類視圖都需要訪問相應的club值。

此值位於URL中,因此請求變量具有該值。但是,有沒有辦法讓我抓住這個值,並在post()方法之外獲取相應的球杆對象?像pre-post()方法什麼的。主要是因爲我不想複製/粘貼club = Club.objects.get(...

更常見的問題 - 所有方法執行的順序是什麼? Django的文檔似乎很缺乏。

回答

2

dispatchpost之前被調用 - 或者就此而言,根據請求調用get。覆蓋它應該讓你設置額外的信息。

該文檔缺少詳細信息 - 直到我閱讀源代碼時才真正瞭解它。但是,除了分散在多個文件之外,源代碼很好讀。

0

您可以在父類中編寫get_club方法。然後你可以在你的子類中使用它,並且你不必重複邏輯。

+0

確實如此,但這並沒有利用類和繼承。按照Peter推薦的方式嘗試'dispatch' – Mikhail

2

其實,你真的在​​顛倒。而不是中心ClubView,爲每個單獨的動作/頁面提供一個視圖類更爲靈活。例如,你可能有這樣的事情:

class ClubListView(ListView): 
    model = Club 

class ClubDetailView(DetailView) 
    model = Club 

# etc... 

這樣,你只需要重寫各自不同的這些行動的具體功能,通過定義上做了你所需要的視圖類的特定方法。例如。您需要根據請求中的內容動態過濾ClubListView中可能的俱樂部?只需重寫ClubListView.get_queryset方法即可應用適當的過濾器。

如果有一些真正特殊的行爲需要應用到所有的視圖中,它取決於這個行爲的真正含義:如果它與這個特定的模型有關,它應該最好在模型中定義,或者也許是其經理;如果它真的是特定於視圖的東西,那麼應該編寫和擴展一個mixin以及實際的視圖類。

+0

非常合適。我不像我應該那樣熟悉所有預定義的類視圖。到目前爲止,我只使用過'TemplateView'。 – Mikhail

+0

我強烈建議你與他們基本相識,因爲他們在那裏是有原因的,會爲你節省大量的工作。另外,獲取https://django.2scoops.org/的副本:-) –