官术网_书友最值得收藏!

3.10 添加視圖

現在網站的后臺管理模塊已經可以工作了,還缺少前臺頁面。投票系統需要以下幾個頁面:

問題索引頁——展示最近的幾個投票問題。

問題詳情頁——展示某個投票的問題和不帶結果的選項列表。

問題結果頁——展示某個投票的結果。

投票處理器——用于響應用戶為某個問題的特定選項投票的操作。

在Django中每一個頁面或者其他內容都是通過視圖呈現出來的,每一個視圖就是一個Python函數或者類方法,Django中的視圖是“一類具有相同功能和模板的網頁的集合”。Django通過URL確定調用哪一個視圖,Django的URL相較于早期網站的URL更加簡潔優雅。

Django通過URLconfs將URL模式字符串與視圖關聯起來,URL模式字符串就是一個URL的一般形式,如/newsarchive/<year>/<month>/。

在polls/views.py文件中添加以下視圖:

修改polls.urls文件,添加以下URL映射:

好了,重啟Web服務器,在瀏覽器中訪問http://127.0.0.1:8000/polls/24/,如下圖所示。

繼續訪問http://127.0.0.1:8000/polls/24/results/和http://127.0.0.1:8000/polls/24/vote/,同樣能夠正常顯示視圖內容,如下面兩幅圖所示。

之所以Django能夠正常調用解析URL,是因為在settings.py中設置了ROOT_URLCONF = 'mysite.urls'。當用戶訪問的URL包含polls/時,Django會根據mysite.urls中的設置,跳轉到polls.urls并進行驗證,直到找到第一個匹配的URL為止。

以上視圖中參數question_id的值來自于<int:question_id>。<int:question_id>用于匹配URL中的值,并將捕捉到的值作為關鍵字參數傳遞給視圖,其中:question_id對應視圖的參數,int:決定了URL中的哪類值符合匹配條件。

3.10.1 擴展視圖

每一個視圖都應該負責一個具體的業務邏輯,視圖執行結束會返回一個包含頁面內容的HttpResponse對象或者異常信息。

下面修改index視圖使它返回最新的5條調查問卷。

代碼Question.objects.order_by('-pub_date')是Django的數據庫API語法,用于從數據庫中查找數據,在介紹模型時將進行詳細講解。

訪問index頁面以查看顯示情況,如下圖所示。

此時調查問卷已經顯示到網頁上,但是可以發現在index視圖中使用了硬編碼,如果想要修改網頁顯示樣式就需要重新編寫Python代碼。對此Django提供了一套模板系統(templates),可以將業務邏輯與頁面顯示樣式分離開。下面來看看如何使用模板系統。

首先在polls文件夾下創建一個新文件夾templates,為了目錄結構清晰,在templates文件夾下再創建一個polls文件夾,最后在polls下創建一個index.html文件。這個index.html就是即將應用于index視圖的模板。

在settings.py中有一個關于模板的配置項:TEMPLATES。Django就是根據這個配置查找并解析模板的,具體工作原理會在第5章進行講解。

將下面代碼寫入模板文件index.html:

接下來修改index視圖:

新視圖會從模板文件夾下加載模板文件并將一個字典對象傳入視圖。

重啟Web服務器,刷新index頁面,效果如下圖所示。

上面代碼的工作原理是先使用loader方法加載模板文件并向它傳遞一個上下文對象(context),然后使用HttpResponse方法初始化一個HttpResponse對象并返回給瀏覽器。由于很多Django視圖都是這樣工作的,因此Django提供了一個簡寫函數:render()。下面使用render函數重寫index視圖:

此時重新訪問index頁面時可以發現效果與之前一樣,但是不再需要loader和HttpResponse方法。

3.10.2 處理404錯誤

404錯誤是一個比較常見的網頁訪問錯誤,當被訪問的URL資源不存在時就會拋出這類錯誤。下面修改detail視圖使其在無法查找到問卷的時候拋出404錯誤。

按照前面步驟在polls文件夾下創建一個detail.html文件作為detail視圖的模板文件,模板內容暫時用{{ question }}表示。

此時重啟Web服務,分別訪問一個存在的和一個不存在的問卷,效果如下面兩幅圖所示。

由于404錯誤是一個非常常見的網頁異常,因此Django也提供了一個簡寫方法:get_object_or_404。下面使用get_object_or_404()修改detail視圖:

重新訪問detail頁面,效果如下圖所示。

此時網頁仍然拋出404錯誤,不過錯誤信息變成Django默認的英文形式,此時可以通過修改get_object_or_404()方法源代碼的方式修改錯誤信息,修改完需要重啟Web服務。

與get_object_or_404相似,Django還提供了一個判斷list是否存在的方法:get_list_or_404,在此不做詳細介紹。

主站蜘蛛池模板: 建宁县| 和硕县| 孝感市| 郸城县| 新宾| 临城县| 平谷区| 哈巴河县| 民权县| 瑞金市| 黄浦区| 安徽省| 滦南县| 道孚县| 石门县| 霞浦县| 如皋市| 隆林| 洞口县| 凉城县| 阿合奇县| 台前县| 焉耆| 塔河县| 乌拉特前旗| 富平县| 黄大仙区| 苍山县| 横山县| 宁晋县| 九台市| 潍坊市| 眉山市| 海门市| 石门县| 海丰县| 九江县| 福鼎市| 云安县| 谢通门县| 英吉沙县|