Python學習之路17.1-Django入門

本系列是對入門書籍《Python編程:從入門到實踐》的筆記整理,屬於初級內容。標題順序採用書中標題。

從本篇開始將是該書的最後一個項目,將用3篇文章來介紹Django的基礎。完成一個“學習筆記”的小網站。

本篇內容較長,所以分為上下兩篇。

1. 前言

在本篇中,我們將:

  • 用Django來開發一個名為“學習筆記”(Learning Log)的項目;

  • 為這個項目制定規範,然後為應用程序使用的數據定義模型;

  • 使用Django的管理系統來輸入一些初試數據,再學習編寫視圖和模板,讓Django能夠為我們的網站創建網頁。

不過在開始之前,請先新建一個虛擬環境並安裝Django。如果沒有虛擬環境,通過pip安裝的所有庫都會保存到python的site-packages目錄下。開發多個項目時,都會用同一個python,而某些項目並不需要其中的所有第三方庫,但如果將這些不需要庫的刪除,又會影響到其他項目。而且,如果A項目需要Django2.0.4,B項目需要Django2.0.0,這該怎麼辦?此時就需要虛擬環境。它其實就相當於一個新的文件夾,將新項目與其他項目隔離,本項目的庫不與其他項目的庫相關聯,類似於操作系統的多用戶概念。

如果使用的是Python 3,可以使用命令:

Python學習之路17.1-Django入門

如果該命令不成功,可能是沒有安裝virtualenv模塊:

Python學習之路17.1-Django入門

然後創建並激活虛擬環境:

Python學習之路17.1-Django入門

管理虛擬環境的庫還有很多,有興趣的話可以到網上搜一搜。

如果你使用的是新版的PyCharm,那麼它在新建項目的時候默認就會創建新的虛擬環境。

激活虛擬環境後就可以安裝Django了:

Python學習之路17.1-Django入門

2. 建立項目

2.1 在Django中創建項目

2.1.1 生成項目

在虛擬環境中執行如下命令:

Python學習之路17.1-Django入門

執行上述命令後,將多出一個manage.py文件和一個learning_log文件夾,當然還有本身的一個ll_env文件夾。

而在learning_log文件夾中,又有四個文件:__init__.py,settings.py,urls.py,wsgi.py。

  • manage.py是一個簡單的程序,它接收命令並將其交給Django的相關部分去運行;

  • settings.py指定Django如何與你的系統交互以及如何管理項目,其實就是配置文件;

  • urls.py告訴Django應創建哪些網頁來響應瀏覽器請求;

  • wsgi.py是web server gateway interface(Web服務器網關接口)的縮寫,幫助Django提供它創建的文件。

至於__init__.py,它是個空文件,Python的每個模塊下必須要有這個文件。

2.1.2 創建數據庫

Django將大部分與項目相關的信息都存儲在數據庫中,所有還需要創建一個供Django使用的數據庫。依然是在虛擬環境下執行如下命令:

Python學習之路17.1-Django入門

在PyCharm中的話,可以通過點擊工具欄Tools中的Run manage.py Task(Ctrl+Alt+R),在彈出的命令行中直接輸入原命令中manage.py後面的部分,後面的命令也可以這樣執行([appname]是自動提示)。

Python學習之路17.1-Django入門

“migrate”這個單詞其實是遷移的意思,並不是“創建(create)”。之所以使用這個詞,是因為一般將修改數據庫的過程稱為遷移數據庫(筆者數據庫學得渣,這段解釋直接從書裡照搬的,希望哪位大神在留言區解釋一波)。如果是剛創建的項目,並且第一次執行,將會得到如下輸出:

Python學習之路17.1-Django入門

從第2行結果可以看出,Django將創建和修改數據庫看做是對數據庫的遷移,Apply all migrations確保數據庫結構與當前代碼匹配(比如你修改了類的結構,添加了屬性,這就相當於修改了數據表)。

執行命令後,項目的根目錄下會多出一個名為db.sqlite3的數據庫文件。SQLite是一種使用單個文件的輕量級數據庫,常用於開發簡單應用程序,它讓你不用太關注數據庫管理的問題。

2.1.3 運行項目

依然在項目的虛擬環境下輸入如下命令:

Python學習之路17.1-Django入門

得到如下輸出:

Python學習之路17.1-Django入門

現在在瀏覽器中地址欄輸入localhost:8000 (127.0.0.1:8000),將得到如下頁面:

Python學習之路17.1-Django入門

這是最新版的Django的默認啟動界面。

2.2 創建應用程序(APP)

2.2.1 創建模型

Django項目由一系列應用程序組成,它們協同工作,讓項目成為一個整體。我們在項目根目錄下執行如下命令,創建一個名為learning_logs的應用程序:

Python學習之路17.1-Django入門

執行命令後,根目錄下會多出一個名為learning_logs的文件夾(筆者第一次接觸Django的時候發現這玩意兒居然叫做APP,和平時用的手機上的各種APP相差也太大了,很不適應),它的結構如下:

Python學習之路17.1-Django入門

重要的是其中的models.py、admin.py和views.py文件,我們將使用models.py來定義我們要在應用程序中管理的數據。另外兩個文件稍後再介紹。

打開models.py文件,發現其中自帶兩行代碼:

Python學習之路17.1-Django入門

在代碼層面,模型就是一個類,和之前的文章中的類一樣,包含屬性和方法。下面創建一個“主題”類:

Python學習之路17.1-Django入門

Model類是Django中的一個定義了模型基本功能的類。Topic類只有兩個屬性text和date_added。模型中如CharField,DateTimeField這些字段還有很多,Django自動根據數據庫的不同調用不同的SQL語句創建數據表,即屏蔽底層數據庫的差異。

同時還重寫了__str__()方法,之所以說“重寫”是因為每個類都有這個方法,當直接將一個類A放入print()之類的語句中時,就會調用A的__str__()方法。如果沒有重寫這個方法,一般會輸出這個對象的內存地址之類的,大家可以蘇隨便寫個類試一試。

2.2.2 激活模型

使用模型前,必須將APP包含到項目中,打開settings.py文件,將APP添加到INSTALLED_APPS中:

Python學習之路17.1-Django入門

這裡有個需要注意的地方,由於這本書的2016年出版的,當時Django還沒有到達2.0版本,所以在書中,註冊APP是這樣寫的:

Python學習之路17.1-Django入門

現在官方文檔中是按照第一種方式註冊APP,並且,最新版的Django在新建APP後,在APP的目錄下還多了一個apps.py文件,該文件默認有一個根據APP名稱創建的類,此處為LearningLogsConfig,內容如下:

Python學習之路17.1-Django入門

回到主線,在終端中輸入:

Python學習之路17.1-Django入門

makemigrations讓Django確定該如何修改數據庫,使其能夠存儲與我們定義的新模型相關聯的數據。從輸出可以看出,在APP目錄下的migrations文件夾中創建了一個名為0001_initial.py的遷移文件,該文件將在數據庫中為模型Topic創建一個表。

最後,在命令行中輸入:

Python學習之路17.1-Django入門

總結:每當需要修改模型時,都採取如下三個步驟:修改models.py,對你的app調用makemigrations,讓Django遷移項目migrate。

2.2.3 Django管理網站

Django自帶管理後臺。首先為網站創建一個超級用戶。在中斷輸入:

Python學習之路17.1-Django入門

隨後按提示輸入用戶名和密碼即可,郵箱地址可以留空(直接回車)。

Django自動在管理網站中添加一些模型,如User和Group,但對於我們創建的模型,必須手工註冊。

注意前面提到的和models.py在同一目錄的admin.py文件,這就是註冊自行編寫的模型的地方,在該文件中加入後兩行代碼:

Python學習之路17.1-Django入門

現在登錄Django自帶的網站管理頁面 http://localhost:8000/admin/ 登錄剛才創建的超級用戶和密碼後將出現如下界面:

Python學習之路17.1-Django入門

在這裡你可以管理用戶和組,以及和模型Topic相關的數據。

現在先手動添加兩個主題:點擊Add創建Chess和Rock Climbing。

Python學習之路17.1-Django入門

2.2.4 定義模型Entry

為使能在每個主題下添加條目,需要定義Entry模型,Entry與Topic的關係是多對一。同樣是在models.py中添加模型:

Python學習之路17.1-Django入門

注意其中嵌套了一個Meta類,它用於管理模型的額外信息。它讓我們能夠設置一個特殊屬性,讓Django在需要時使用Entries來表示多個條目。如果沒有這個類,Django將使用Entrys來表示多個條目(保證英語語法正確……不得不說,本書作者還是很細心的)。

添加了新模型,所以需要再次遷移數據庫,過程就是前面講的三個步驟中的後兩步。然後在admin.py中註冊Entry。

為了讓這個網站有一些初試數據,添加三個條目:兩個Chess的,一個Rock Climbing的。在管理頁面中點擊Entries的Add按鈕,你將看到一個下拉列表,用於選擇Topic,還有個文本框,用於輸入內容。隨便輸入一點內容就可以,具體內容不再詳細列出。

2.2.5 Django shell

輸入一些數據後,可通過交互式終端會話以編程方式查看這些數據。這種交互式環境稱為Django shell,常用語測試項目和排除故障。以下是在shell中的一些操作:

Python學習之路17.1-Django入門

為了通過外鍵獲取數據,注意查詢時的語法:“模型小寫名稱+下劃線+set”,如第19行代碼。編寫用戶可請求的網頁時將使用這樣的語法。如果代碼在shell中的行為符合預期,那麼它們在項目文件中也能正確工作。

未完待續!本篇太長,分為兩部分。


分享到:


相關文章: