国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

在Django的通用視圖中處理Context的方法

2020-02-23 01:39:51
字體:
來源:轉載
供稿:網友

制作友好的模板Context

你也許已經注意到范例中的出版商列表模板在變量 object_list 里保存所有的書籍。這個方法工作的很好,只是對編寫模板的人不太友好。 他們必須知道這里正在處理的是書籍。 更好的變量名應該是publisher_list,這樣變量所代表的內容就顯而易見了。

我們可以很容易地像下面這樣修改 template_object_name 參數的名稱:

from django.conf.urls.defaults import *from django.views.generic import list_detailfrom mysite.books.models import Publisherpublisher_info = {  'queryset': Publisher.objects.all(),  'template_name': 'publisher_list_page.html',  'template_object_name': 'publisher',}urlpatterns = patterns('',  (r'^publishers/$', list_detail.object_list, publisher_info))

在模板中,通用視圖會通過在template_object_name后追加一個_list的方式來創建一個表示列表項目的變量名。

使用有用的 template_object_name 總是個好想法。 你的設計模板的合作伙伴會感謝你的。
添加額外的Context

你常常需要呈現比通用視圖提供的更多的額外信息。 例如,考慮一下在每個出版商的詳細頁面顯示所有其他出版商列表。 object_detail 通用視圖為context提供了出版商信息,但是看起來沒有辦法在模板中 獲取 所有 出版商列表。

這是解決方法: 所有的通用視圖都有一個額外的可選參數 extra_context 。這個參數是一個字典數據類型,包含要添加到模板的context中的額外的對象。 所以要給視圖提供所有出版商的列表,我們就用這樣的info字典:

publisher_info = {  'queryset': Publisher.objects.all(),  'template_object_name': 'publisher',  **'extra_context': {'book_list': Book.objects.all()}**}

這樣就把一個 {{ book_list }} 變量放到模板的context中。 這個方法可以用來傳遞任意數據 到通用視圖模板中去,非常方便。 這是非常方便的

不過,這里有一個很隱蔽的BUG,不知道你發現了沒有?

我們現在來看一下, extra_context 里包含數據庫查詢的問題。 因為在這個例子中,我們把 Publisher.objects.all() 放在URLconf中,它只會執行一次(當URLconf第一次加載的時候)。 當你添加或刪除出版商,你會發現在重啟Web服務器之前,通用視圖不會反映出這些修改(有關QuerySet何時被緩存和賦值的更多信息請參考附錄C中“緩存與查詢集”一節)。

備注

這個問題不適用于通用視圖的 queryset 參數。 因為Django知道有些特別的 QuerySet 永遠不能 被緩存,通用視圖在渲染前都做了緩存清除工作。

解決這個問題的辦法是在 extra_context 中用一個回調(callback)來代替使用一個變量。 任何傳遞給extra_context的可調用對象(例如一個函數)都會在每次視圖渲染前執行(而不是只執行一次)。 你可以象這樣定義一個函數:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武定县| 太仆寺旗| 定西市| 班戈县| 中阳县| 大石桥市| 安远县| 永宁县| 广丰县| 祁阳县| 揭阳市| 铜梁县| 延津县| 寿宁县| 长乐市| 临安市| 当雄县| 那曲县| 柏乡县| 和田县| 建湖县| 宜兰市| 奉新县| 富民县| 固安县| 诏安县| 泗水县| 利津县| 淮南市| 印江| 清水县| 辽中县| 炎陵县| 山东省| 阿鲁科尔沁旗| 昌黎县| 东阿县| 墨竹工卡县| 桐庐县| 塔河县| 兴隆县|