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