- Django 3.0入門與實踐
- 李健編著
- 1386字
- 2021-03-27 00:17:36
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,在此不做詳細介紹。
- The Complete Rust Programming Reference Guide
- TypeScript Blueprints
- Developing Mobile Web ArcGIS Applications
- NLTK基礎教程:用NLTK和Python庫構建機器學習應用
- Selenium Design Patterns and Best Practices
- 用Python實現深度學習框架
- concrete5 Cookbook
- Mastering JBoss Enterprise Application Platform 7
- 深入淺出React和Redux
- Service Mesh實戰:基于Linkerd和Kubernetes的微服務實踐
- Internet of Things with ESP8266
- SSH框架企業級應用實戰
- The Statistics and Calculus with Python Workshop
- SAP Web Dynpro for ABAP開發技術詳解:基礎應用
- Selenium Essentials