Django 學習筆記 part 1
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
Django學習資源
建立一個虛擬環境 ( virtualenv ) python 3.3
有許多優點:
- 你的專案會擁有一個專屬的獨立 Python 環境
- 不需要 root 權限,就可以安裝新套件。
- 方便控管不同版本的套件,不用擔心
- 升級套件會影響到其他專案。
- 如果需要多人協作或在不同機器上跑同一個專案時,使用虛擬環境也可以確保環境一致性。
VENV
python3 -m venv VENV
source VENV/bin/activate
接著就來安裝 django 1.7 版本中最新的那個!
- pip install "django<1.8"
天外飛來一筆:
在實驗室的sever上面run的方法:
使用指令 python manage.py runserver 0.0.0.0:8000
把本機端的VENV傳到server上
scp -r VENV 我的帳號@實驗室的ip:~/
:~/ 這是放到我的根目錄,後面其實可以再加東西
scp 是 secure copy的簡寫
更新code到server上
rsync -a VENV 我的帳號@實驗室的ip:~/
rsync 用法
做完剛剛的pip install "django<1.8"以後
使用VENV
source VENV/bin/activate
建立 Django project建立專案資料夾 -- startproject
首先,使用 django-admin.py 來建立第一個 Django project mysite:
- django-admin.py startproject mysite
此時會多了一個 mysite 資料夾,我們切換進去
- cd mysite
- startproject 這個 Django 指令除了建立專案資料夾,也預設會建立一些常用檔案,你可以使用 ls 或 dir /w (Windows) 檢視檔案結構。
目前 project 的檔案結構如下:
- mysite/
- ├── mysite
- │ ├── __init__.py
- │ ├── settings.py
- │ ├── urls.py
- │ └── wsgi.py
- └── manage.py
要跑server的話使用指令
python manage.py runserver
建立 Django application (app)
現在,讓我們利用 startapp 建立第一個 Django app -- trips:
- python manage.py startapp trips
- startapp會按照你的命名建立一個同名資料夾和 app 預設的檔案結構如下:
- trips
- ├── __init__.py
- ├── admin.py
- ├── migrations
- ├── models.py
- ├── tests.py
- └── views.py
Django Views
Django view 其實是一個 function,處理 HttpRequest 物件,並回傳 HttpResponse 物件,大致說明如下:
- 會收到HttpRequest 物件參數: Django 從網頁接收到 request 後,會將 request 中的資訊封裝產生一個 HttpRequest 物件,並當成第一個參數,傳入對應的 view function。
- 需要回傳HttpResponse物件: HttpResponse 物件裡面包含:
- HttpResponse.content
- HttpResponse.status_code ...等
Django Urls
最後,Django 需要知道 URL 與 View 的對應關係。
例如:
而這個對應關係就是 URL conf (URL configuration)。
URL Conf
- 通常定義在urls.py
- 是一連串的規則 (url pattern)
- Django 收到 request 時,會一一比對 URL Conf 中的規則,決定要執行哪個 view function
安裝套件
- pip install python-dateutil
HTML動態內容
第一個 Template
在前一個例子,我們把 HTML/CSS 放在 View function 裡。但在實務上,我們會將前端的程式碼獨立出來,放在 templates 資料夾裡。不僅增加可讀性,也方便與設計師或前端工程師分工。
Template 資料夾
首先建立 Template 資料夾。開啟終端機 (如果不想關閉 web server,可以再開新一個新的終端機視窗),並確認目前所在位置為 djangogirls/mysite/。
新增一個名為 templates 的資料夾`:
- mkdir templates
設定 Templates 資料夾的位置
建立好資料夾以後,我們需要修改mysite/settings.py,加上TEMPLATE_DIRS:
- # mysite/settings.py
- TEMPLATE_DIRS = (
- os.path.join(BASE_DIR, 'templates').replace('\\', '/'),
- )
Models
現今的網站,都不再只是僅單純展示網頁內容的靜態網頁。大多數網站,都會加上一些與使用者互動的功能,如留言版、討論區、投票...等。而這些使用者產出的資料,往往會儲存於資料庫中。
這一章,你會學到如何利用 Django Model 定義資料庫的結構 ( Schema ),並透過 Django 指令創建資料庫、資料表及欄位。
使用 Django Model 的好處
雖然資料庫的語法有其標準,但是各家資料庫還是或多或少有差異。使用 Django Model 的來操作資料庫的優點之一,就是資料庫轉換相當方便。
在大部份情況下,不再需要為不同的資料庫,使用不同語法來撰寫程式。只要修改設定,就可以輕易地從 SQLite 轉換到 MySQL、PostgreSQL、或是 Oracle...等等。
建好model的話跟RoR一樣要做 migration
恩失敗了
根據他說的要先
python manage.py makemigrations
再 python manage.py migrate
使用 Django ORM 操作資料庫
在上一章,我們學到如何使用 Django Model 抽象地表達資料庫結構。 在完成 Model 的定義後,我們即可使用 Django 提供的豐富 API ,來與資料庫互動。
本章你會學到:如何使用 Django API 來與資料庫互動 (CRUD)。
CRUD 指的是,Create (新增)、Read (讀取)、Update (修改)、Delete (刪除) 等常見的資料庫操作。
使用 Django Shell
與先前不同的是,在這裡我們不使用 Python Shell。 若要在 Python Shell 使用 Django 的功能或模組,還需另外載入設定。
所以我們這裡使用的是 Django Shell
Django Shell
與 Python Shell 類似的互動式命令列。會預先載入 Django 的相關設定,所以可以在此執行 Django 的 API。
- python manage.py shell
這個 shell 和我們之前輸入 python 執行的 shell 長得一樣,只是它會預先為我們設定 Django 需要的環境,方便我們執行 Django 相關的程式。
Create
首先,讓我們來試著新增幾筆資料:
- >>> from trips.models import Post
- >>> Post.objects.create(title='My First Trip', content='肚子好餓,吃什麼好呢?', location='台北火車站')
- <Post: Post object>
- >>> Post.objects.create(title='My Second Trip', content='去散散步吧', location='台北火車站')
- <Post: Post object>
- >>> Post.objects.create(title='Django 大冒險', content='從靜態到動態', location='台北市大安區復興南路一段293號')
- <Post: Post object>
Read
- >>> Post.objects.all()
- [<Post: Post object>, <Post: Post object>, <Post: Post object>]
Django 通常以 <Post: Post object> 來表示 Post 物件,但此種顯示不易辨別。我們可以透過def __str__ 更改 Post 的表示方式,修改 trips/models.py:
- # trips/models.py
- from django.db import models
- class Post(models.Model):
- ...
- created_at = models.DateTimeField(auto_now_add=True)
- def __str__(self):
- return self.title
退出 Django Shell 後再重新進入,Post 已經被重新定義成顯示標題,如 <Post: Your_Post_Title>。
- >>> Post.objects.all()
- [<Post: My First Trip>, <Post: My Second Trip>, <Post: Django 大冒險>]
而只想顯示部分資料時,則可以使用 get 或 filter:
- >>> Post.objects.get(id=1)
- <Post: My First Trip>
- >>> Post.objects.filter(id__gt=1)
- [<Post: My Second Trip>, <Post: Django 大冒險>]
- get:返回符合條件的唯一一筆資料。 ( 注意:如果找不到符合條件的資料、或是有多筆資料符合條件,都會產生 exception )
- filter:返回符合條件的陣列。如果找不到任何資料則會返回空陣列。
Update
首先,先取得欲更新的 Post。這裡使用 id < 3 的條件篩選
- >>> posts = Post.objects.filter(id__lt=3)
共有 2個 Post 符合 id < 3 的條件
- >>> posts
- [<Post: My First Trip>, <Post: My Second Trip>]
我們將 location 的值印出
- >>> posts[0].location
- '台北火車站'
- >>> posts[1].location
- '台北火車站'
- >>>
印出後發現, 兩個 Post 的 location 都是台北火車站。現在我們試試用 update 指令,把它改成'捷運大安站'
- >>> posts.update(location='捷運大安站')
- 2
回傳的數字 2 指的是已被更新的資料筆數。我們可以驗證一下,location 是否皆已被正確更新
- >>> posts[0].location
- '捷運大安站'
- >>> posts[1].location
- '捷運大安站'
Delete
我們試著使用 delete,將剛剛的那兩筆 Post 刪除。
- >>> posts.delete()
確認一下,資料是否刪除
- >>> Post.objects.all()
- [<Post: Django 大冒險>]
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
留言
張貼留言