眾所周知,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 文檔中查看有關基於類的視圖的更多信息,從這裡開始,這裡,這裡
ccbv.co.uk 是一個很好的替代文檔,專注於基於 django 類的視圖
以上是Django 基於類別的視圖變得簡單的詳細內容。更多資訊請關注PHP中文網其他相關文章!