前情提要:
從零開始製作 Django 圖書館網站


基礎環境設定

創建資料夾

$ mkdir djangoBoy

新增虛擬環境

$ cd djangoBoy
$ python3 -m venv virtualenv

啟動虛擬環境

$ source virtualenv/vin/activate

離開虛擬環境

$ deactivate

Django 建立新應用程式 - hello world

新增基礎資料夾

就像 rails new product-name 一樣,django 也有指令產生基礎的文件。

$ django-admin startproject library

這樣輸入後,就會產生一些我們會用到的資料夾

library/
    manage.py
    library/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

這些目錄和文件的用途是:

  • 最外層的library/根目錄只是你項目的容器,根目錄名稱對 Django 沒有影響,你可以將它重命名為任何你喜歡的名稱。
  • manage.py: 一個讓你用各種方式管理 Django 項目的命令工具。你可以閱讀django-admin 和 manage.py獲取所有manage.py的細節。
  • 裡面一層的library/ 目錄包含你的項目,它是一個純Python包。它的名字就是當你引用它內部任何東西時需要用到的Python包名library.urls。
  • library/init.py:一個空文件,告訴 Python 這個目錄應該被認為是一個 Python 包。如果你是 Python 初學者,閱讀官方文檔中更多關於包的知識。
  • library/settings.py:Django項目的配置文件。如果你想知道這個文件是如何工作的,請查看Django配置了解細節。
  • library/urls.py:Django 項目的 URL 聲明,就像你網站的“目錄”。閱讀URL 調度器文檔來獲取更多關於 URL 的內容。
  • library/asgi.py:為你的項目的運行在 ASGI 包含的 Web 服務器上的入口。閱讀如何使用 ASGI 來部分了解更多細節。
  • library/wsgi.py:為你的項目的運行在 WSGI 包含的 Web 服務上的入口。閱讀如何使用 WSGI 進入部分了解了更多細節。

啟動 server

輸入以下指令,就會像 rails s 一樣啟動本地 server

$ python3 manage.py runserver

開始新增其他應用

我們剛剛新增的是一個大項目,接著我們要用多種不同的 app 補足這個項目,以 rails 舉例,我們接著就是要來設定不同的 controller。
現在要新增的就是圖書館中的目錄應用程式。

$ python3 manage.py startapp catalog

這樣輸入後,會產生另外一個資料夾:

library/    
    catalog/
        migrations/       -> 放資料庫的變動過程,跟 rails 的 migration 差不多
        __init__.py       
        admin.py          -> 可以進入 admin 模式編輯 catalog 的資料
        apps.py           -> 註冊功能的地方
        models.py         -> MVT 中的 M,放 catalog 中的 model 資料,跟 rails 的 model 差不多,不過最大的不同是,這邊的 model 會描寫欄位的屬性,像是結合的 rails 的 schema
        tests.py          -> 這個資料夾是測試資料夾,測試在這邊寫
        views.py          -> MVT 中的 V,放 catalog 中收發 request 和 response 的地方,跟 rails 的 controller 差不多
    manage.py
    library/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

註冊 catalog 應用

我們要到 library/settings 的地方,把剛剛新創的 功能,加進整個應用程式內,才能以順利啟用。

# settings

INSTALLED_APPS = [
    'catalog.apps.CatalogConfig',       # 新增這一行
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

設定起始資料庫

我們一開始先用 sqlite3 就好,如果之後是要上線的應用程式,在換成別的資料庫

# settings

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

時區設定

# settings

TIME_ZONE = 'Asia/Taipei'

index 頁面的 hello world

我們來寫第一個頁面的 hello world!要設定起始頁面,第一步驟想當然是設定 routes,就像 rails 中設定 routes 一樣, Django 是在 url.py 設定路徑:

不過跟 rails 不同的地方在於,在 Django 路徑路分兩層,還記得我們前面註冊 catalog 功能 的時候提到, Django 每個功能是拆開的,想要用的時候要去 installApp 那邊進行注冊,而路徑也差不多,首先到最外層的urls.py 檔案:

# library/urls.py

from django.conf.urls import include

urlpatterns += [
    path('catalog/', include('catalog.urls'))
]

上面的意思是,今天整個應用程式,我想要引入 catalog.urls 的內容,並且路徑是 catalog/

最外層設定好,接下來是內層設定,我們在 catalog 資料夾內,新增一個 urls.py 的檔案 (預設是沒有的喔,要自己新增),接著設定 首頁 路徑:

# library/catalog/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index, name="index")
]

上面的意思是,path後面接的三個參數:
(1) “” : 代表的是實際路徑,給兩個引號,代表他呈現的路徑會長這樣:catalog/
(2) views.index : 這代表這個路徑,他會去 views 這個檔案中,找到 index 這個方法,呈現頁面上的資訊,就跟 rails 的 controller 方法 和 routes 上的設定 類似
(3) name=”index” : 這代表的是,如果後面我們在寫頁面的 template 時,我們會設定頁面的連結,可以直接套上 name 的設定,這樣就不用每次都寫一長串的 a 路徑

預設首頁

如果今天想要像 rails 這樣,預設把 /houses 這個連結預設成根路徑:

root "houses#index"

Django 想要做到可以像這樣,利用 RedirectView 方法:

# library/urls.py

from django.views.generic import RedirectView

urlpatterns += [
    path("", RedirectView.as_view(url='/catalog/'))
]

這樣當你的路徑假設是這樣: http://127.0.0.1:8000/ ,他會自動重導成這樣 http://127.0.0.1:8000/catalog/

啟用靜態文件 - 這個還不確定!!!!!!!

# library/urls.py

# Use static() to add url mapping to serve static files during development (only)
from django.conf import settings
from django.conf.urls.static import static

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

這樣我們就完成第一個網頁 + hello world 了!!!!!!!

具現化資料庫

假設今天 model 已經設定好,想要把它具現化,如同 rails g migration 一樣,django 的具現化有兩步驟:

  1. 第一個指令,他會偵測你的 model 有沒有變動過,如果有的話,他會列出你改變哪些設定
    $ python3 manage.py makemigrations
    
  2. 第二個指令,他會幫你具現化資料庫
    $ python3 manage.py migrate