天天看點

如何建立一個Django網站1. 建立項目2. 運作項目3. 建立 app4. 建立模型5. 管理 admin6. 視圖和URL配置7. 總結

運作下面指令就可以建立一個 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>[&lt;question: question object&gt;]</code>,我們可以修改模型類,使其輸出更為易懂的描述。修改模型類:

接下來繼續測試:

django有一個優秀的特性, 内置了django admin背景管理界面, 友善管理者進行添加和删除網站的内容.

建立的項目系統已經為我們設定好了背景管理功能,見 mysite/settings.py:

同時也已經添加了進入背景管理的 url, 可以在 mysite/urls.py 中檢視:

接下來我們需要建立一個管理使用者來登入 admin 背景管理界面:

上面建立了一個 admin 的超級使用者,密碼也為 admin。

再次運作項目:

如何建立一個Django網站1. 建立項目2. 運作項目3. 建立 app4. 建立模型5. 管理 admin6. 視圖和URL配置7. 總結

輸入使用者名和密碼,你可以看到:

如何建立一個Django網站1. 建立項目2. 運作項目3. 建立 app4. 建立模型5. 管理 admin6. 視圖和URL配置7. 總結

這時候你可以看到,你可以修改 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>&lt;app name&gt;/&lt;model name&gt;_detail.html</code> 模闆,我們可以使用 <code>template_name</code> 變量重新定義模闆路徑;類似的, listview 預設使用<code>&lt;app name&gt;/&lt;model name&gt;_list.html</code> 模闆。

detailview 視圖中的上下文預設就包含了對模型的引用,如 question 變量;對于 listview 視圖,為 question_list 變量,如果我們想修改該變量名稱,可以通過<code>context_object_name 變量覆寫預設的名稱</code>,如使用 latest_question_list 代替 question_list。

最後,來看項目目錄結構:

通過上面的介紹,對 django 的安裝、運作以及如何建立視圖和模型有了一個清晰的認識,接下來就可以深入的學習 django 的自動化測試、持久化、中間件、國際化等知識。