# TemplateResponse 和 SimpleTemplateResponse #
標準的`HttpResponse` 對象是靜態的結構。在構造的時候提供給它們一個渲染之前的內容,但是當內容改變時它們卻不能很容易地完成相應的改變。
然而,有時候允許裝飾器或者中間件在響應被構造之后修改它是很有用的。例如,你可能想改變使用的模板,或者添加額外的數據到上下文中。
`TemplateResponse` 提供了實現這一點的方法。與基本的HttpResponse 對象不同,`TemplateResponse` 對象會記住視圖提供的模板和上下文的詳細信息來計算響應。響應的最終結果在后來的響應處理過程中直到需要時才計算。
## SimpleTemplateResponse 對象 ##
`class SimpleTemplateResponse[source]`
### 屬性 ###
`SimpleTemplateResponse.template_name`
渲染的模板的名稱。接收一個與后端有關的模板對象(例如`get_template()` 返回的對象)、模板的名稱或者一個模板名稱列表。
例如:`['foo.html', 'path/to/bar.html']`
```
Deprecated since version 1.8:
template_name 以前只接受一個 Template。
```
`SimpleTemplateResponse.context_data`
渲染模板時用到的上下文數據。它必須是一個`dict`。
例如:`{'foo': 123}`
```
Deprecated since version 1.8:
context_data 以前只接受一個 Context。
```
`SimpleTemplateResponse.rendered_content[source]`
使用當前的模板和上下文數據渲染出來的響應內容。
`SimpleTemplateResponse.is_rendered[source]`
一個布爾值,表示響應內容是否已經渲染。
### 方法 ###
`SimpleTemplateResponse.__init__(template, context=None, content_type=None, status=None, charset=None, using=None)[source]`
使用給定的模板、上下文、Content-Type、HTTP 狀態和字符集初始化一個`SimpleTemplateResponse` 對象。
`template`
一個與后端有關的模板對象(例如`get_template()` 返回的對象)、模板的名稱或者一個模板名稱列表。
```
Deprecated since version 1.8:
template 以前只接受一個Template。
```
`context`
一個`dict`,包含要添加到模板上下文中的值。它默認是一個空的字典。
```
Deprecated since version 1.8:
context 以前只接受一個Context。
```
`content_type`
HTTP `Content-Type `頭部包含的值,包含MIME 類型和字符集的編碼。 如果指定`content_type`,則使用它的值。 否則,使用`DEFAULT_CONTENT_TYPE`。
`status`
響應的HTTP 狀態碼。
`charset`
響應編碼使用的字符集。 如果沒有給出則從`content_type`中提取,如果提取不成功則使用 `DEFAULT_CHARSET` 設置。
`using`
加載模板使用的模板引擎的名稱。
```
Changed in Django 1.8:
添加charset 和using 參數。
```
`SimpleTemplateResponse.resolve_context(context)[source]`
預處理即將用于渲染模板的上下文數據。接受包含上下文數據的一個`dict`。默認返回同一個`dict`。
若要自定義上下文,請覆蓋這個方法。
```
Changed in Django 1.8:
resolve_context 返回一個dict。它以前返回一個Context。
```
```
Deprecated since version 1.8:
resolve_context 不再接受Context。
```
`SimpleTemplateResponse.resolve_template(template)[source]`
解析渲染用到的模板實例。接收一個與后端有關的模板對象(例如`get_template()` 返回的對象)、模板的名稱或者一個模板名稱列表。
返回將被渲染的模板對象。
若要自定義模板的加載,請覆蓋這個方法。
```
Changed in Django 1.8:
resolve_template 返回一個與后端有關的模板對象。它以前返回一個Template。
```
```
Deprecated since version 1.8:
resolve_template 不再接受一個 Template。
```
`SimpleTemplateResponse.add_post_render_callback()[source]`
添加一個渲染之后調用的回調函數。這個鉤子可以用來延遲某些特定的處理操作(例如緩存)到渲染之后。
如果`SimpleTemplateResponse` 已經渲染,那么回調函數將立即執行。
調用的時只傳遞給回調函數一個參數 —— 渲染后的 `SimpleTemplateResponse` 實例。
如果回調函數返回非`None` 值,它將用作響應并替換原始的響應對象(以及傳遞給下一個渲染之后的回調函數,以此類推)。
`SimpleTemplateResponse.render()[source]`
設置`response.content` 為`SimpleTemplateResponse.rendered_content` 的結果,執行所有渲染之后的回調函數,最后返回生成的響應對象。
`render()` 只在第一次調用它時其作用。以后的調用將返回第一次調用的結果。
## TemplateResponse 對象 ##
`class TemplateResponse[source]`
`TemplateResponse` 是`SimpleTemplateResponse` 的子類,而且能知道當前的`HttpRequest`。
### 方法 ###
`TemplateResponse.__init__(request, template, context=None, content_type=None, status=None, current_app=None, charset=None, using=None)[source]`
使用給定的模板、上下文、`Content-Type`、HTTP 狀態和字符集實例化一個`TemplateResponse` 對象。
`request`
An `HttpRequest` instance.
`template`
一個與后端有關的模板對象(例如`get_template()` 返回的對象)、模板的名稱或者一個模板名稱列表。
```
Deprecated since version 1.8:
template 以前只接受一個Template。
```
`context`
一個`dict`,包含要添加到模板上下文中的值。 它默認是一個空的字典。
```
Deprecated since version 1.8:
context 以前只接受一個Context。
```
`content_type`
HTTP `Content-Type` 頭部包含的值,包含MIME 類型和字符集的編碼。如果指定`content_type`,則使用它的值。否則,使用`DEFAULT_CONTENT_TYPE`。
`status`
響應的HTTP 狀態碼。
`current_app`
包含當前視圖的應用。更多信息,參見帶命名空間的URL 解析策略。
```
Deprecated since version 1.8:
廢棄current_app 參數。你應該去設置request.current_app。
```
`charset`
響應編碼使用的字符集。如果沒有給出則從content_type中提取,如果提取不成功則使用 DEFAULT_CHARSET 設置。
`using`
加載模板使用的模板引擎的名稱。
```
Changed in Django 1.8:
添加charset 和using 參數。
```
## 渲染的過程 ##
在`TemplateResponse` 實例返回給客戶端之前,它必須被渲染。渲染的過程采用模板和上下文變量的中間表示形式,并最終將它轉換為可以發送給客戶端的字節流。
三種情況下會渲染`TemplateResponse`:
+ 當使用SimpleTemplateResponse.render() 方法顯示渲染TemplateResponse 實例的時候。
+ 當通過給response.content 賦值顯式設置響應內容的時候。
+ 在應用模板響應中間件之后,應用響應中間件之前。
`TemplateResponse` 只能渲染一次。`SimpleTemplateResponse.render()` 的第一次調用設置響應的內容;以后的響應不會改變響應的內容。
然而,當顯式給`response.content` 賦值時,修改會始終生效。如果你想強制重新渲染內容,你可以重新計算渲染的內容并手工賦值給響應的內容:
```
# Set up a rendered TemplateResponse
>>> from django.template.response import TemplateResponse
>>> t = TemplateResponse(request, 'original.html', {})
>>> t.render()
>>> print(t.content)
Original content
# Re-rendering doesn't change content
>>> t.template_name = 'new.html'
>>> t.render()
>>> print(t.content)
Original content
# Assigning content does change, no render() call required
>>> t.content = t.rendered_content
>>> print(t.content)
New content
```
### 渲染后的回調函數 ###
某些操作 —— 例如緩存 —— 不可以在沒有渲染的模板上執行。它們必須在完整的渲染后的模板上執行。
如果你正在使用中間件,解決辦法很容易。中間件提供多種在從視圖退出時處理響應的機會。如果你向響應中間件添加一些行為,它們將保證在模板渲染之后執行。
然而,如果正在使用裝飾器,就不會有這樣的機會。裝飾器中定義的行為會立即執行。
為了補償這一點(以及其它類似的使用情形)`TemplateResponse` 允許你注冊在渲染完成時調用的回調函數。使用這個回調函數,你可以延遲某些關鍵的處理直到你可以保證渲染后的內容是可以訪問的。
要定義渲染后的回調函數,只需定義一個接收一個響應作為參數的函數并將這個函數注冊到模板響應中:
```
from django.template.response import TemplateResponse
def my_render_callback(response):
# Do content-sensitive processing
do_post_processing()
def my_view(request):
# Create a response
response = TemplateResponse(request, 'mytemplate.html', {})
# Register the callback
response.add_post_render_callback(my_render_callback)
# Return the response
return response
```
`my_render_callback()` 將在`mytemplate.html` 渲染之后調用,并將被傳遞一個`TemplateResponse` 實例作為參數。
如果模板已經渲染,回調函數將立即執行。
## 使用TemplateResponse 和SimpleTemplateResponse ##
`TemplateResponse` 對象和普通的`django.http.HttpResponse` 一樣可以用于任何地方。它可以用來作為`render()` 和`render_to_response()` 的另外一種選擇。
例如,下面這個簡單的視圖使用一個簡單模板和包含查詢集的上下文返回一個`TemplateResponse`:
```
from django.template.response import TemplateResponse
def blog_index(request):
return TemplateResponse(request, 'entry_list.html', {'entries': Entry.objects.all()})
```
> 譯者:[Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html),原文:[TemplateResponse objects](https://docs.djangoproject.com/en/1.8/ref/template-response/)。
>
> 本文以 [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格式化輸入
- “本地特色”
- 常見的網站應用工具
- 認證
- 概覽
- 使用認證系統
- 密碼管理
- 日志
- 分頁
- 會話
- 數據驗證
- 其它核心功能
- 按需內容處理
- 重定向
- 信號
- 系統檢查框架