Class-based views
視圖是可調用的,能接受用戶的請求並返回響應。視圖遠不只是個函數,Django提供了一些可用作視圖的類的示例,允許你通過繼承和複用構建自己的視圖並且複用這些代碼。雖然接下來還會介紹一些用於簡單任務的通用視圖,但你可能想自己設計可複用的視圖結構,以便針對某些特殊場景。詳情請見 基於類的視圖參考文檔。
- 基於類的視圖
- 內置CBV視圖
- 使用基於類的視圖進行表單處理
- 將mixins與基於類的視圖一起使用
1. 基本的例子
Django提供適合各種應用程序的基本視圖類。所有視圖都繼承自View類,該類處理將視圖鏈接到URL,HTTP方法調度和其他簡單功能。RedirectView用於簡單的HTTP重定向,TemplateView 擴展基類以使其也呈現模板。
2. 在URLconf中簡單使用
使用通用視圖的最簡單方法是直接在URLconf中創建它們。如果您只是在基於類的視圖上更改一些簡單屬性,則可以將它們簡單地傳遞給 as_view()方法調用本身:
from django.urls import path
from django.views.generic import TemplateView
urlpatterns = [
path('about/', TemplateView.as_view(template_name="about.html")),
]
傳遞給as_view()的任何參數都將覆蓋在類上設置的屬性。在這個例子中,我們設置了TemplateView的 template_name
屬性。類似的重寫模式可用於 RedirectView中的url
屬性。
3. 子類化通用視圖
使用通用視圖的更強大的方法是從現有視圖繼承並在子類中覆蓋屬性(例如template_name
)或方法(例如get_context_data
)以提供新值或方法。例如,考慮一個只顯示一個模板的視圖 about.html
。Django有一個通用視圖 TemplateView 來執行此操作 - 所以我們可以將其子類化,並覆蓋模板名稱:
# some_app/views.py
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = "about.html"
然後我們只需要將這個新視圖添加到我們的URLconf中。 TemplateView是一個類,而不是一個函數,所以我們將URL指向as_view() 類方法,它爲基於類的視圖提供了類似函數的條目:
# urls.py
from django.urls import path
from some_app.views import AboutView
urlpatterns = [
path('about/', AboutView.as_view()),
]
有關如何使用內置通用視圖的更多信息,請參閱有關 基於類的通用視圖。
4. 支持其他HTTP方法
假設某人想要使用視圖作爲API來通過HTTP訪問我們的圖書庫。API客戶端會不時地連接並下載自上次訪問以來發布的書籍的書籍數據。但是,如果從那以後沒有出現新書,那麼從數據庫中獲取書籍,呈現完整的響應並將其發送給客戶端會浪費CPU時間和帶寬。在最新出版的書出版時,最好詢問API。
我們將URL映射到URLconf中的book list視圖:
from django.urls import path
from books.views import BookListView
urlpatterns = [
path('books/', BookListView.as_view()),
]
並且視圖是這樣的:
from django.http import HttpResponse
from django.views.generic import ListView
from books.models import Book
class BookListView(ListView):
model = Book
def head(self, *args, **kwargs):
last_book = self.get_queryset().latest('publication_date')
response = HttpResponse('')
# RFC 1123 date format
response['Last-Modified'] = last_book.publication_date.strftime('%a, %d %b %Y %H:%M:%S GMT')
return response
如果從GET請求訪問視圖,則在響應中返回簡單明瞭的對象列表(使用book_list.html
模板)。但是,如果客戶端發出HEAD請求,則響應具有空的響應體,Last-Modified
響應頭指示最近發佈的書籍的時間。根據此信息,客戶端可能會也可能不會下載完整的對象列表。