Django 學習
基礎指令
前情提要:
從零開始製作 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 的具現化有兩步驟:
- 第一個指令,他會偵測你的 model 有沒有變動過,如果有的話,他會列出你改變哪些設定
$ python3 manage.py makemigrations
- 第二個指令,他會幫你具現化資料庫
$ python3 manage.py migrate