眾所周知,django在開發Web應用程式時使用MVT(模型-視圖-模板)進行設計。
View 本身是一個可呼叫的,它接受請求並回傳回應。它不僅僅是一個函數,因為 Django 提供了一種稱為「基於類別的視圖」的東西,因此開發人員可以使用基於類別的方法或您可以說 OOP 方法來編寫視圖。這個基於類別的視圖的設計使我們可以建立我們的視圖,並可以透過繼承和混合的力量重複使用。
正如 django 文件中詳細記錄的那樣,基於函數的視圖的問題之一是無法擴展或自定義它們超出某些配置選項,從而限制了它們在許多實際應用程序中的有用性。
django 中的基底類別和 mixins 工具包旨在實現最大的靈活性。讓我們來看看如何使用 View 類別繼承在 django 中使用最基本的基於類別的視圖,並將其與基於函數的視圖進行比較。
#views.py using View class inheritance from django.views import View from django.http import HttpResponse, HttpRequest class IndexView(View): def get(self, request: HttpRequest): # imagine 10 line of view logic here return HttpResponse("Hello world from indexview") def post(self, request: HttpRequest): # imagine 10 line of view logic here return HttpResponse("Hello world from indexview in post method")
#views.py function based view from django.http import HttpResponse, HttpRequest def index(request: HttpRequest): if request.method == "GET": # imagine 10 line of view logic here return HttpResponse("Hello world from index funcion view") elif request.method == "POST": # imagine 10 line of view logic here return HttpResponse("Hello world from index funcion view in post method")
如果您查看上面的內容,基於類別的視圖允許您使用不同的類別實例方法回應不同的 HTTP 請求方法,而不是在單一視圖函數內使用條件分支程式碼。現在想像一下,在上面的每個視圖中,我們為每個方法添加了 10 行邏輯,您應該可以看出哪一個更容易演練。
為了將基於類別的視圖註冊到 url 配置中,我們必須呼叫 as_view() 類別方法,該方法基本上將類別視圖轉換為可呼叫函數。這個轉換後的函數將呼叫setup()來初始化其屬性,然後呼叫dispatch()來檢查使用者有哪些方法(GET、POST或其他方法),並將請求方法連接到基於類別的視圖最初具有的對應匹配方法
#urls.py from django.urls import path from myapp.views import IndexView, index urlpatterns = [ path("", IndexView.as_view(), name=IndexView.__name__), path("index/", index, name=index.__name__), ]
基於類別的視圖也支援django所有的http快捷方式,例如render()函數來渲染模板,這裡是django cbv使用render捷徑的修改範例並與django訊息框架配合
class IndexView(View): def get(self, request: HttpRequest): # imagine 10 line of view logic here return render(request, "GEtindex.html") def post(self, request: HttpRequest): # imagine 10 line of view logic here messages.add_message(request, messages.INFO, "POST Success") #add display success message here by django messages framework return render(request, "POSTindex.html")
總的來說,基於django 類別的視圖允許開發人員更好地編寫來理解視圖邏輯,視圖邏輯越複雜,我很確定如果我們只使用基於函數的視圖,閱讀起來會更加困難(太多的if 語句來檢查什麼)方法是使用者使用的範例)並且難以擴展,同時django CBV 旨在將我們的視圖邏輯分解為多種方法,例如get 和post 方法。如果你願意的話,可以在繼承中再次使用,儘管我可以說,我們在一個類別中擁有的繼承越多,由於它的抽象性,它就越難以閱讀。
您可以在 django 文件中查看有關基於類的視圖的更多信息,從這裡開始,這裡,這裡
還有一個很好的替代文檔,專注於基於 django 類的視圖是 ccbv.co.uk
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3