基于類的視圖

2021-10-19 19:30 更新

基于類的視圖

視圖是可調(diào)用的,它接受請求并返回響應(yīng)。這不僅可以是一個函數(shù),而且Django提供了一些可用作視圖的類的示例。這些使您可以利用繼承和混合來構(gòu)造視圖并重用代碼。對于任務(wù),還有一些通用的視圖,我們將在以后進行介紹,但是您可能想要設(shè)計自己的可重用視圖結(jié)構(gòu),以適合您的用例。有關(guān)完整的詳細信息,請參見基于類的視圖參考文檔。


基本的例子

Django提供了適合各種應(yīng)用程序的基本視圖類。所有視圖都從View該類繼承,該類負責(zé)將視圖鏈接到URL,HTTP方法分派和其他常見功能。RedirectView提供HTTP重定向,并TemplateView擴展基類以使其也呈現(xiàn)模板。

URLconf中的用法

使用通用視圖的最直接方法是直接在URLconf中創(chuàng)建它們。如果僅在基于類的視圖上更改一些屬性,則可以將它們傳遞給as_view()方法調(diào)用本身:

from django.urls import path
from django.views.generic import TemplateView
?
urlpatterns = [
  path('about/', TemplateView.as_view(template_name="about.html")),
]

傳遞給任何參數(shù)as_view()將覆蓋在類上設(shè)置的屬性。在此示例中,我們將設(shè)置template_name 為TemplateView??梢詫ι系膗rl屬性使用類似的覆蓋模式 RedirectView。

子類化通用視圖

使用通用視圖的第二種更強大的方法是從現(xiàn)有視圖繼承并覆蓋子類中的屬性(例如template_name)或方法(例如get_context_data)以提供新的值或方法。例如,考慮一個僅顯示一個模板的視圖 about.html。Django有一個通用視圖可以執(zhí)行此操作-- TemplateView因此我們可以將其子類化,并覆蓋模板名稱:

# some_app/views.py
from django.views.generic import TemplateView
?
class AboutView(TemplateView):
  template_name = "about.html"

然后,我們需要將此新視圖添加到我們的URLconf中。 TemplateView是一個類,而不是一個函數(shù),因此我們將URL指向as_view()類方法,該方法為基于類的視圖提供類似函數(shù)的條目:

# urls.py
from django.urls import path
from some_app.views import AboutView
?
urlpatterns = [
  path('about/', AboutView.as_view()),
]

有關(guān)如何使用內(nèi)置通用視圖的更多信息,請參考下一個基于通用類的視圖的主題。

支持其他的HTTP方法

假設(shè)有人想使用視圖作為API通過HTTP訪問我們的圖書庫。API客戶端會時不時地進行連接,并下載自上次訪問以來發(fā)布的圖書的圖書數(shù)據(jù)。但是,如果從那以后沒有新書出現(xiàn),那么從數(shù)據(jù)庫中獲取書本,呈現(xiàn)完整的響應(yīng)并將其發(fā)送給客戶端將浪費CPU時間和帶寬。最好向API詢問最新書籍的發(fā)布時間。

我們將URL映射到URLconf中的書列表視圖:

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請求訪問視圖,則在響應(yīng)中返回對象列表(使用book_list.html模板)。但是,如果客戶發(fā)出HEAD請求,則響應(yīng)的主體為空,Last-Modified 標題會指示最新書籍的發(fā)布時間。根據(jù)此信息,客戶端可以下載也可以不下載完整的對象列表。

詳情參考: https://docs.djangoproject.com/en/3.0/


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號