視圖是一個可調用對象,它接收一個請求然后返回一個響應。這個可調用對象可以不只是函數(shù),Django 提供一些可以用作視圖的類。它們允許你結構化你的視圖并且利用繼承和混合重用代碼。后面我們將介紹一些用于簡單任務的通用視圖,但你可能想要設計自己的可重用視圖的結構以適合你的使用場景。完整的細節(jié),請參見基于類的視圖的參考文檔。
Django 提供基本的視圖類,它們適用于廣泛的應用。所有的視圖類繼承自View類,它負責連接視圖到URL、HTTP 方法調度和其它簡單的功能。RedirectView用于簡單的HTTP 重定向,TemplateView擴展基類來渲染模板。
使用通用視圖最簡單的方法是在URLconf 中創(chuàng)建它們。如果你只是修改基于類的視圖的一些簡單屬性,你可以將它們直接傳遞給as_view()方法調用:
from django.conf.urls import url
from django.views.generic import TemplateView
urlpatterns = [
url(r'^about/', TemplateView.as_view(template_name="about.html")),
]
傳遞給as_view()的參數(shù)將覆蓋類中的屬性。在這個例子中,我們設置TemplateView的template_name??梢允褂妙愃频姆椒ǜ采wRedirectView的url屬性。
第二種,功能更強一點的使用通用視圖的方式是繼承一個已經(jīng)存在的視圖并在子類中覆蓋其屬性(例如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是一個類不是一個函數(shù),所以我們將URL 指向類的as_view()方法,它讓基于類的視圖提供一個類似函數(shù)的入口:
# urls.py
from django.conf.urls import url
from some_app.views import AboutView
urlpatterns = [
url(r'^about/', AboutView.as_view()),
]
關于如何使用內建的通用視圖的更多信息,參考下一主題通用的基于類的視圖。
假設有人想通過HTTP 訪問我們的書庫,它使用視圖作為API。這個API 客戶端將隨時連接并下載自上次訪問以來新出版的書籍的數(shù)據(jù)。如果沒有新的書籍,仍然從數(shù)據(jù)庫中獲取書籍、渲染一個完整的響應并發(fā)送給客戶端將是對CPU 和帶寬的浪費。如果有個API 用于查詢書籍最新發(fā)布的時間將會更好。
我們在URLconf 中映射URL 到書籍列表視圖:
from django.conf.urls import url
from books.views import BookListView
urlpatterns = [
url(r'^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模板)。但如果客戶端發(fā)出一個HEAD請求,響應將具有一個空的響應體而Last-Modified頭部會指示最新發(fā)布的書籍的時間?;谶@個信息,客戶端可以下載或不下載完整的對象列表。
譯者:Django 文檔協(xié)作翻譯小組,原文:Overview。
本文以 CC BY-NC-SA 3.0 協(xié)議發(fā)布,轉載請保留作者署名和文章出處。
Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。