基于類(lèi)的視圖

2021-10-19 19:30 更新

基于類(lèi)的視圖

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


基本的例子

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

URLconf中的用法

使用通用視圖的最直接方法是直接在URLconf中創(chuàng)建它們。如果僅在基于類(lèi)的視圖上更改一些屬性,則可以將它們傳遞給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()將覆蓋在類(lèi)上設(shè)置的屬性。在此示例中,我們將設(shè)置template_name 為T(mén)emplateView??梢詫?duì)上的url屬性使用類(lèi)似的覆蓋模式 RedirectView。

子類(lèi)化通用視圖

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

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

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

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

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

支持其他的HTTP方法

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

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

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

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)