運作下面指令就可以建立一個 django 項目,項目名稱叫 mysite :
建立後的項目目錄如下:
說明:
<code>__init__.py</code> :讓 python 把該目錄當成一個開發包 (即一組子產品)所需的檔案。 這是一個空檔案,一般你不需要修改它。
<code>manage.py</code> :一種指令行工具,允許你以多種方式與該 django 項目進行互動。 鍵入<code>python manage.py help</code>,看一下它能做什麼。 你應當不需要編輯這個檔案;在這個目錄下生成它純是為了友善。
<code>settings.py</code> :該 django 項目的設定或配置。
<code>urls.py</code>:django項目的url路由設定。目前,它是空的。
接下來,你可以修改 settings.py 檔案,例如:修改 <code>language_code</code>、設定時區 <code>time_zone</code>
在運作項目之前,我們需要建立資料庫和表結構,這裡我使用的預設資料庫:
然後啟動服務:
你會看到下面的輸出:
你也可以指定啟動端口:
以及指定 ip:
前面建立了一個項目并且成功運作,現在來建立一個 app,一個 app 相當于項目的一個子子產品。
在項目目錄下建立一個 app:
如果操作成功,你會在 mysite 檔案夾下看到已經多了一個叫 polls 的檔案夾,目錄結構如下:
每一個 django model 都繼承自 django.db.models.model
在 model 當中每一個屬性 attribute 都代表一個 database field
通過 django model api 可以執行資料庫的增删改查, 而不需要寫一些資料庫的查詢語句
打開 polls 檔案夾下的 models.py 檔案。建立兩個模型:
然後在 mysite/settings.py 中修改 ` installed_apps` 添加 polls:
在添加了新的 app 之後,我們需要運作下面指令告訴 django 你的模型做了改變,需要遷移資料庫:
你會看到下面的輸出日志:
你可以從 polls/migrations/0001_initial.py 檢視遷移語句。
運作下面語句,你可以檢視遷移的 sql 語句:
輸出結果:
你可以運作下面指令,來檢查資料庫是否有問題:
再次運作下面的指令,來建立新添加的模型:
總結一下,當修改一個模型時,需要做以下幾個步驟:
修改 models.py 檔案
運作 <code>python manage.py makemigrations</code> 建立遷移語句
運作 <code>python manage.py migrate</code>,将模型的改變遷移到資料庫中
建立了模型之後,我們可以通過 django 提供的 api 來做測試。運作下面指令可以進入到 python shell 的互動模式:
下面是一些測試:
列印所有的 question 時,輸出的結果是 <code>[<question: question object>]</code>,我們可以修改模型類,使其輸出更為易懂的描述。修改模型類:
接下來繼續測試:
django有一個優秀的特性, 内置了django admin背景管理界面, 友善管理者進行添加和删除網站的内容.
建立的項目系統已經為我們設定好了背景管理功能,見 mysite/settings.py:
同時也已經添加了進入背景管理的 url, 可以在 mysite/urls.py 中檢視:
接下來我們需要建立一個管理使用者來登入 admin 背景管理界面:
上面建立了一個 admin 的超級使用者,密碼也為 admin。
再次運作項目:
輸入使用者名和密碼,你可以看到:
這時候你可以看到,你可以修改 groups 和 users 兩個對象,但是你不能修改你添加的模型。下面來使你添加的模型也能修改,修改 polls/admin.py:
你單擊表頭時,會發現 was_published_recently 這一列無法排序,我們可以修改 polls/models.py 中的 question 模型,額外添加一些屬性:
在項目根路徑建立一個 templates 目錄,并修改 mysite/settings.py 檔案,添加下面設定:
在 templates 下面建立一個 admin 目錄,并從 django admin 模闆路徑下拷貝 admin/base_site.html 檔案到 admin 目錄下,修改該檔案:
同樣,你可以參考上面定制 admin/index.html 内容。
安裝:
然後在 mysite/settings.py 中修改 installed_apps:
django 中 views 裡面的代碼就是一個一個函數邏輯,處理用戶端(浏覽器)發送的 httprequest,然後傳回 httpresponse。
建立 <code>polls/views.py </code>檔案并添加如下内容:
在 <code>polls/urls.py</code> 中添加一個 url 映射:
這時候 polls 目錄結構如下:
在上面視圖檔案中,我們隻是告訴 django,所有指向 url <code>/index/</code> 的請求都應由 index 這個視圖函數來處理。
django 在檢查 url 模式前,移除每一個申請的url開頭的斜杠。 這意味着我們為 <code>/index/</code> 寫url模式不用包含斜杠。
模式包含了一個尖号(<code>^</code>)和一個美元符号(<code>$</code>)。這些都是正規表達式符号,并且有特定的含義: ^要求表達式對字元串的頭部進行比對,$符号則要求表達式對字元串的尾部進行比對。
如果你通路 <code>/index</code>,預設會重定向到末尾帶有反斜杠的請求上去,這是受配置檔案setting中 <code>append_slash</code> 項控制的。
如果你是喜歡所有url都以 <code>/</code> 結尾的人(django開發者的偏愛),那麼你隻需要在每個 url 後添加斜杠,并且設定 <code>append_slash</code> 為 “true”。如果不喜歡url以斜杠結尾或者根據每個 url 來決定,那麼需要設定 <code>append_slash</code> 為 “false”,并且根據你自己的意願來添加結尾斜杠/在url模式後。
接下來配置項目根路徑的 url 映射,修改 mysite/urls.py 如下:
修改 polls/views.py 檔案,添加:
然後,修改 polls/urls.py 添加映射:
正規表達式是通用的文本模式比對的方法。 django urlconfs 允許你使用任意的正規表達式來做強有力的 url 映射,不過通常你實際上可能隻需要使用很少的一部分功能。這裡是一些基本的文法。
符号
比對
.
任意單一字元
\d
任意一位數字
[a-z]
a 到 z中任意一個字元(大寫)
a 到 z中任意一個字元(小寫)
[a-za-z]
a 到 z中任意一個字元(不區分大小寫)
+
比對一個或更多 (例如, \d+ 比對一個或 多個數字字元)
[^/]+
一個或多個不為‘/’的字元
*
零個或一個之前的表達式(例如:\d? 比對零個或一個數字)
比對0個或更多 (例如, \d* 比對0個 或更多數字字元)
{1,3}
介于一個和三個(包含)之前的表達式(例如,\d{1,3}比對一個或兩個或三個數字)
接下來使視圖傳回動态内容,修改 mysite/views.py 内容如下:
接下來在視圖中使用模闆,在 settings.py 中有一個 <code>template_loaders</code> 屬性,并且有一個預設值 <code>django.template.loaders.app_directories.loader</code>,該值定義了從每一個安裝的 app 的 templates 目錄下尋找模闆,故我們可以在 polls 目錄下建立 templates 目錄以及其子目錄 polls。
現在建立一個首頁頁面 polls/templates/polls/index.html:
注意: 頁面中的 latest_question_list 變量來自視圖傳回的上下文,見下面 context 變量
然後更新 polls/views.py 視圖,來使用模闆:
代碼說明:
通過 loader 來加載模闆頁面,如前面提到的,這裡是相對 polls/templates 目錄
建立上下文,将需要傳遞到頁面的變量放入上下文變量 context
使用 template 通過上下文來渲染頁面
上面代碼,可以使用 <code>render()</code> 來簡化:
當查詢資料傳回錯誤時,可以抛出異常,讓頁面重定向到 404 頁面:
現在,我們可以回過頭來修改 polls/index.html 頁面中下面代碼:
上面代碼中的 url 為寫死的,我們可以将其修改為:
為了避免多個視圖的名稱,例如 detail 視圖,的沖突,我們可以給 url 添加命名空間,修改 mysite/urls.py:
然後,修改 polls/templates/polls/index.html 為:
接下來建立明細頁面 polls/templates/polls/detail.html:
建立一個顯示投票結果頁面 polls/templates/polls/results.html :
接下來修改 polls/views.py 添加 detail 、 vote 和 results 三個函數:
重新開機服務進行測試,檢查是否有錯誤。
如果我們要針對很多模型編寫視圖,則有很多代碼都是重複的,我們可以使用 django 中的通用視圖來簡化代碼。首先,我們将 polls/urls.py 改成如下:
然後,我們删除 polls/views.py 中的 index、detail 和 results 三個函數,vote 函數和之前保持一緻,最後改為如下:
這裡我們使用了兩個通用視圖 : listview 和 detailview,來和模型相關聯。
detailview 視圖需要傳遞一個名稱為 pk 表示模型主鍵的參數,是以我們需要把 url 映射中的 question_id 改為 pk。
預設情況下, detailview使用 <code><app name>/<model name>_detail.html</code> 模闆,我們可以使用 <code>template_name</code> 變量重新定義模闆路徑;類似的, listview 預設使用<code><app name>/<model name>_list.html</code> 模闆。
detailview 視圖中的上下文預設就包含了對模型的引用,如 question 變量;對于 listview 視圖,為 question_list 變量,如果我們想修改該變量名稱,可以通過<code>context_object_name 變量覆寫預設的名稱</code>,如使用 latest_question_list 代替 question_list。
最後,來看項目目錄結構:
通過上面的介紹,對 django 的安裝、運作以及如何建立視圖和模型有了一個清晰的認識,接下來就可以深入的學習 django 的自動化測試、持久化、中間件、國際化等知識。