Django入門與實踐-第17章:保護視圖
Django 有一個內置的視圖裝飾器 來避免它被未登陸的用戶訪問:
如今若是用戶沒有登陸,將被重定向到登陸頁面:
如今嘗試登陸,登陸成功後,應用程序會跳轉到原來所在的位置。
Django入門與實踐-第18章:訪問已登陸用戶
如今我麼能夠改進 new_topic 視圖,將發佈主題的用戶設置當前登陸的用戶,取代以前直接從數據庫查詢出來的第一個用戶,
以前這份代碼是臨時的,由於那時候尚未方法去獲取登陸用戶,可是如今能夠了:
有兩個關鍵字參數,pk用於惟一標識版塊(Board),topic_pk用於惟一標識該回復來自哪一個主題。
Django入門與實踐-第19章:主題回覆
值得注意的是:在視圖函數replay_topic中,咱們使用 topic_pk ,由於咱們引用的是函數的關鍵字參數,
而在new_topic視圖中,咱們使用的是 topic.pk ,由於 topic 是一個對象(Topic模型的實例對象),
.pk 是這個實例對象的一個屬性,這兩種細微的差異,其實區別很大,別搞混了。
Django入門與實踐-第20章:QuerySets(查詢結果集)
如今咱們花點時間來探索關於模型的 API。首先,咱們來改進主題:
有3個任務:
顯示每一個板塊的總主題數
顯示每一個板塊的總回覆數
顯示每一個板塊的最後發佈者和日期
在實現這些功能前,咱們先使用Python終端
由於咱們要在Python終端嘗試,因此,把全部的 models 定義一個__str__ 方法是個好主意
在 Post 模型中,使用了 Truncator 工具類,這是將一個將字符串截取爲任意長度字符的簡便方法(這?咱們使用30個字符)
雙下劃線的 topic__board 用於經過模型關係來定位,在內部,
Django 在Board-Topic-Post之間構建了橋樑,構建SQL查詢來獲取屬於指定版塊下面的帖子回覆。
最後一個任務是標識版塊下?的最後?條回覆
Django入門與實踐-第21章:遷移
遷移(Migration)是Django作Web開發的基本組成部分,它使得咱們在演進應用的models時,它能使得models文件與數據庫保持同步。
當咱們第一次運行命令 python manage.py migrate 的時候,Django 會抓取全部遷移文件而後?成數據庫 schema。
當Django應用了遷移以後,有一個特殊的表叫作django_migrations,在這個表中,Django註冊了全部已經的遷移記錄。
咱們添加了一個 PositiveIntegerField ,由於這個字段將要存儲的是頁面的瀏覽量,不多是一個負數
在這節課中,咱們在留言板的基礎功能上取得了一些進步,還剩下一些東西等待去實現,
好比:編輯帖子、個人帳戶(更改我的信息)等等。以後咱們將提供markdown語法和列表的分頁功能。
Django入門與實踐-第22章:基於類的視圖
歡迎來到系列教程的第六部分!在這篇教程中,咱們將詳細探討基於類的視圖(簡稱CBV)。
咱們也將重構一些現有的視圖,以便利用內置的基於類的通用視圖(Generic Class-Based Views)。
這篇教程咱們還將討論許多其餘主題,例如如何使用分頁,如何使用markdown以及如何添加簡單的編輯器。
咱們還將探索一個名爲 Humanize的內置軟件包,用於對數據進行「人爲操做」。
到頭來,全部的Django視圖其實都是函數。即使是CBV。在類的底層,它完成了全部的功能並最終返回一個視圖函數。
在咱們繼續教程以前,讓咱們清楚這三個術語的含義:
基於函數的視圖(FBV)
基於類的視圖(CBV)
基於類的通用視圖(GCBV)
FBV是Django視圖中最簡單的表示:它就是一個接收 HttpRequest 對象並返回一個 HttpResponse 的函數。
CBV是每一個Django視圖都被定義爲一個擴展 django.views.generic.view抽象類後的 Python 類。
GCBV是能夠解決一些具體問題的內置的CBV集合,好比列表視圖,建立,更新和刪除視圖等。
基於類的視圖 (CBV)
CBV是View類的集成類。這裏的主要區別在於請求是以HTTP方法命名的類用法內處理的,例如GET ,POST ,PUT ,HEAD 等。
因此,在這裏,咱們不須要作一個條件來判斷請求是一個 POST 仍是它是一個 GET 。
代碼會直接跳轉到正確的方法中。在 View 類中內部處理了這個邏輯。
總之,關於CBV的好處是咱們能夠在類裏面添加更多的方法,也許能夠這樣作:
基於類的經過視圖(GCBV)
接下來關於GCBV。這是一個不一樣的狀況。正如我前面提到的,GCBV是內置CBV的常見用例。
它們的實現每每會大量使用多重繼承(混合繼承)和其餘面向對象的策略。
列表視圖
咱們如今能夠利用 CBV 的功能來重構一些現有的視圖。以主頁爲例,咱們就先從數據庫中抓取全部的 boards 並將其羅列在HTML中:
Django入門與實踐-第23章:分頁實現
咱們能夠很是容易地使用 CBV 來實現分頁功能。但首先我想手工分頁,這樣就更有助於咱們理解背後的機制,這樣它就不那麼神祕了。
實際上對 boards 列表視圖分頁並無意義,由於咱們不指望有不少boards。但無疑對於主題列表和帖子列表來講是須要一些分頁的。
FBV 分頁
這裏是咱們如何使用 FBV 來實現分頁:
GCBV 分頁
下面,相同的實現,但此次使用ListView。
可複用的分頁模板
就像咱們在 form.html 中封裝模板時作的同樣,咱們也能夠爲分頁的HTML代碼來建立相似的東西。
咱們來對主題帖子頁面進行分頁,進而找到一種複用分頁組件的方法。
如今,咱們從topics.html模板中獲取分頁部分的html代碼片,
並在templates/includes 文件夾下面建立一個名爲 pagination.html 的新文件,和 forms.html 同級目錄:
Django入門與實踐-第24章:個人帳戶視圖
好的,那麼,這部分將是咱們最後的一個視圖。以後,咱們將專心來改進現有功能。
Django入門與實踐-第25章:Markdown 支持
讓咱們在文本區域添加 Markdown 支持來改善用戶體驗。你會看到要實現這個功能很是簡單。
首先,咱們安裝一個名爲 Python-Markdown 的庫:
pip install markdown
默認狀況下,這個插件會將它找到的第一個文本區域轉換爲 markdown 編輯器。因此這點代碼應該就足夠了:
Django入門與實踐-第26章:個性化工具
我以爲只添加內置的個性化(humanize)包就會很不錯。它包含一組爲數據添加「個性化(human touch)」的工具集。
例如,咱們可使用它來更天然地顯示日期和時間字段。咱們能夠簡單地顯示:「2分鐘前」,而不是顯示整個日期。
咱們所要作的就是在模板中加載 {%load humanize%} 這個模板標籤,而後在模板中使用過濾器: {{ topic.last_updated|naturaltime }}