# 基于類的視圖 #
視圖是一個可調用對象,它接收一個請求然后返回一個響應。這個可調用對象可以不只是函數,Django 提供一些可以用作視圖的類。它們允許你結構化你的視圖并且利用繼承和混合重用代碼。后面我們將介紹一些用于簡單任務的通用視圖,但你可能想要設計自己的可重用視圖的結構以適合你的使用場景。完整的細節,請參見基于類的視圖的參考文檔。
+ [基于類的視圖簡介](http://python.usyiyi.cn/django/topics/class-based-views/intro.html)
+ [內建的基于類的通用視圖](http://python.usyiyi.cn/django/topics/class-based-views/generic-display.html)
+ [使用基于類的視圖處理表單](http://python.usyiyi.cn/django/topics/class-based-views/generic-editing.html)
+ [使用混合來擴展視圖類](http://python.usyiyi.cn/django/topics/class-based-views/mixins.html)
## 基本的示例 ##
Django 提供基本的視圖類,它們適用于廣泛的應用。所有的視圖類繼承自`View`類,它負責連接視圖到URL、HTTP 方法調度和其它簡單的功能。`RedirectView`用于簡單的HTTP 重定向,`TemplateView`擴展基類來渲染模板。
## 在URLconf 中的簡單用法 ##
使用通用視圖最簡單的方法是在URLconf 中創建它們。如果你只是修改基于類的視圖的一些簡單屬性,你可以將它們直接傳遞給`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()`的參數將覆蓋類中的屬性。在這個例子中,我們設置`TemplateView`的`template_name`。可以使用類似的方法覆蓋`RedirectView`的`url`屬性。
## 子類化通用視圖 ##
第二種,功能更強一點的使用通用視圖的方式是繼承一個已經存在的視圖并在子類中覆蓋其屬性(例如`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.conf.urls import url
from some_app.views import AboutView
urlpatterns = [
url(r'^about/', AboutView.as_view()),
]
```
關于如何使用內建的通用視圖的更多信息,參考下一主題通用的基于類的視圖。
## 支持其它HTTP 方法 ##
假設有人想通過HTTP 訪問我們的書庫,它使用視圖作為API。這個API 客戶端將隨時連接并下載自上次訪問以來新出版的書籍的數據。如果沒有新的書籍,仍然從數據庫中獲取書籍、渲染一個完整的響應并發送給客戶端將是對CPU 和帶寬的浪費。如果有個API 用于查詢書籍最新發布的時間將會更好。
我們在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`模板)。但如果客戶端發出一個`HEAD`請求,響應將具有一個空的響應體而`Last-Modified`頭部會指示最新發布的書籍的時間。基于這個信息,客戶端可以下載或不下載完整的對象列表。
> 譯者:[Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html),原文:[Overview](https://docs.djangoproject.com/en/1.8/topics/class-based-views/)。
>
> 本文以 [CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/cn/) 協議發布,轉載請保留作者署名和文章出處。
>
> [Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html)人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。
- 新手入門
- 從零開始
- 概覽
- 安裝
- 教程
- 第1部分:模型
- 第2部分:管理站點
- 第3部分:視圖和模板
- 第4部分:表單和通用視圖
- 第5部分:測試
- 第6部分:靜態文件
- 高級教程
- 如何編寫可重用的應用
- 為Django編寫首個補丁
- 模型層
- 模型
- 模型語法
- 元選項
- 模型類
- 查詢集
- 執行查詢
- 查找表達式
- 模型的實例
- 實例方法
- 訪問關聯對象
- 遷移
- 模式編輯器
- 編寫遷移
- 高級
- 管理器
- 原始的SQL查詢
- 聚合
- 多數據庫
- 自定義查找
- 條件表達式
- 數據庫函數
- 其它
- 遺留的數據庫
- 提供初始數據
- 優化數據庫訪問
- 視圖層
- 基礎
- URL配置
- 視圖函數
- 快捷函數
- 裝飾器
- 參考
- 內建的視圖
- TemplateResponse 對象
- 文件上傳
- 概覽
- File 對象
- 儲存API
- 管理文件
- 自定義存儲
- 基于類的視圖
- 概覽
- 內建顯示視圖
- 內建編輯視圖
- API參考
- 分類索引
- 高級
- 生成 CSV
- 生成 PDF
- 中間件
- 概覽
- 內建的中間件類
- 模板層
- 基礎
- 面向設計師
- 語言概覽
- 人性化
- 面向程序員
- 表單
- 基礎
- 概覽
- 表單API
- 內建的Widget
- 高級
- 整合媒體
- 開發過程
- 設置
- 概覽
- 應用程序
- 異常
- 概覽
- django-admin 和 manage.py
- 添加自定義的命令
- 測試
- 介紹
- 部署
- 概述
- WSGI服務器
- 部署靜態文件
- 通過email追蹤代碼錯誤
- Admin
- 管理操作
- 管理文檔生成器
- 安全
- 安全概述
- 說明Django中的安全問題
- 點擊劫持保護
- 加密簽名
- 國際化和本地化
- 概述
- 本地化WEB UI格式化輸入
- “本地特色”
- 常見的網站應用工具
- 認證
- 概覽
- 使用認證系統
- 密碼管理
- 日志
- 分頁
- 會話
- 數據驗證
- 其它核心功能
- 按需內容處理
- 重定向
- 信號
- 系統檢查框架