Django 完整學習路線圖 (從零到一個部落格)
這份教材將分為以下幾個部分:

- 前置準備:環境搭建 - 安裝 Python 和虛擬環境。
- 第一部分:Django 入門 - 創建第一個 Django 專案和應用。
- 第二部分:數據模型與管理後台 - 定義數據庫結構,並使用 Django 自動生成的管理後台。
- 第三部分:視圖、URL 與模板 - 實現動態頁面,展示數據給用戶。
- 第四部分:動態頁面與用戶交互 - 實現文章詳情頁、列表頁和刪除功能。
- 第五部分:靜態文件與頁面美化 - 添加 CSS 和 JavaScript,讓網站看起來更專業。
- 第六部分:部署上線 - 將你的網站發佈到網路上。
- 總結與進階學習資源 - 接下來可以學什麼?
前置準備:環境搭建
在開始之前,你需要安裝 Python,請確認你的電腦上已經安裝了 Python 3.6 或更高版本,你可以在終端機(Terminal 或 Command Prompt)輸入以下指令檢查:
python --version
推薦:使用虛擬環境
為了避免不同專案之間的套件版本衝突,我們強烈建議為每個專案創建一個獨立的「虛擬環境」。
-
進入你的專案目錄:
(图片来源网络,侵删)# 創建一個資料夾用來存放所有你的 Django 專案 mkdir django_projects cd django_projects
-
創建虛擬環境: 我們使用
venv這個 Python 內建的模組。# myblog 是虛擬環境的名稱,你可以隨意取 python -m venv myblog
-
啟用虛擬環境:
- macOS / Linux:
source myblog/bin/activate
- Windows:
.\myblog\Scripts\activate
啟用後,你的終端機提示字元前面會出現
(myblog),表示你已經在虛擬環境中了。
- macOS / Linux:
-
安裝 Django: 在虛擬環境中,我們使用
pip來安裝 Django。pip install django
第一部分:Django 入門
創建第一個 Django 專案
Django 專案就像一個大型的網站應用程式,我們使用 django-admin 來創建它。
# django-admin startproject <專案名稱> django-admin startproject myblog_project
這會創建一個名為 myblog_project 的資料夾,結構如下:
myblog_project/
├── manage.py # 一個命令列工具,用於與專案互動
└── myblog_project/ # 專案的設定包
├── __init__.py
├── asgi.py # 伺服器入口點 (用於非同步伺服器)
├── settings.py # 專案的所有設定檔
├── urls.py # 專案的 URL 聲明 (URL 路由)
└── wsgi.py # 伺服器入口點 (用於同步伺服器)
創建第一個 Django 應用
一個專案可以包含多個「應用」,一個電商網站可以有「商品」、「購物車」、「使用者」等不同的應用,我們來創建一個用於管理部落格文章的應用。
# python manage.py startapp <應用名稱> python manage.py startapp blog
現在,你的專案結構變成了:
myblog_project/
├── manage.py
├── myblog_project/
└── blog/ # 這是我們新創建的應用
├── __init__.py
├── admin.py
├── apps.py
├── migrations/ # 存放數據庫遷移檔案的資料夾
├── models.py
├── tests.py
└── views.py # 存放視圖函數的檔案
配置應用
我們需要告訴 Django 我們創建了 blog 這個應用,打開 myblog_project/settings.py,找到 INSTALLED_APPS 這個列表,並將 blog 添加進去。
# myblog_project/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog', # 在這裡添加我們的 blog 應用
]
執行開發伺服器
讓我們啟動 Django 的開發伺服器來看看我們的專案是否成功運行。
python manage.py runserver
打開你的瀏覽器,訪問 http://127.0.0.1:8000/,如果你看到了 Django 的歡迎頁面,恭喜你!你的 Django 專案已經成功運行了!
第二部分:數據模型與管理後台
定義數據模型
模型是數據庫結構的定義,我們來定義一個 Post 模型,用於儲存文章的標題、內容和發布時間。
打開 blog/models.py 檔案,並輸入以下內容:
# blog/models.py
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):= models.CharField(max_length=200, verbose_name="標題")
content = models.TextField(verbose_name="內容")
created_at = models.DateTimeField(auto_now_add=True, verbose_name="創建時間")
author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="作者")
def __str__(self):
return self.title
class Meta:
verbose_name = "文章"
verbose_name_plural = "文章列表"
ordering = ['-created_at'] # 按創建時間倒序排列
說明:
CharField: 用於儲存短文本,如標題。TextField: 用於儲存長文本,如內容。DateTimeField: 用於儲存日期和時間。auto_now_add=True: 在對象第一次被創建時自動設置為當前時間。ForeignKey: 建立與User模型的關聯,表示每篇文章都有一個作者。
創建並應用數據庫遷移
Django 的遷移系統可以將你對模型的更改同步到數據庫中。
-
生成遷移檔案:
python manage.py makemigrations blog
這會在
blog/migrations/目錄下生成一個新的遷移檔案。 -
應用遷移:
python manage.py migrate
這會在數據庫中創建
blog_post這張表。
註冊模型到管理後台
Django 自帶一個強大的管理後台,我們可以將 Post 模型註冊進去,方便我們管理數據。
打開 blog/admin.py 檔案,並輸入以下內容:
# blog/admin.py
from django.contrib import admin
from .models import Post
# 自定義 PostAdmin 類,可以更好地控制後台顯示
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'created_at') # 在列表頁顯示的欄位
list_filter = ('created_at', 'author') # 側邊欄的過濾器
search_fields = ('title', 'content') # 搜尋框
# 將 Post 模型和 PostAdmin 類註冊到管理後台
admin.site.register(Post, PostAdmin)
創建超級用戶
要訪問管理後台,你需要一個超級用戶帳號。
python manage.py createsuperuser
按照提示輸入你想要的用戶名、電子郵箱和密碼。
測試管理後台
- 確保你的開發伺服器正在運行 (
python manage.py runserver)。 - 在瀏覽器中訪問
http://127.0.0.1:8000/admin/。 - 使用你剛剛創建的超級用戶帳號登入。
- 你會看到一個 "Authentication and Authorization" 區塊,點擊 "Posts"。
- 點擊 "Add post" 來添加幾篇測試文章。
第三部分:視圖、URL 與模板
現在,我們要讓這些文章顯示在網站的前台頁面上,這需要三個部分:URL、視圖 和 模板。
創建視圖
視圖是一個 Python 函數,它接收一個 Web 請求並返回一個 Web 響應,我們來創建一個顯示所有文章列表的視圖。
打開 blog/views.py,並添加以下內容:
# blog/views.py
from django.shortcuts import render
from .models import Post
def post_list(request):
# 從數據庫中獲取所有文章,並按創建時間倒序排列
posts = Post.objects.all().order_by('-created_at')
# 將 posts 變量傳遞給模板
context = {
'posts': posts
}
# 渲染模板並返回 HttpResponse
return render(request, 'blog/post_list.html', context)
創建 URL 路由
URL 路由負責將 URL 路徑映射到對應的視圖函數。
-
在應用內創建 URL: 在
blog應用中創建一個urls.py檔案。# blog/urls.py from django.urls import path from . import views urlpatterns = [ # 當訪問根路徑時,映射到 post_list 視圖 path('', views.post_list, name='post_list'), ] -
在專案中包含應用 URL: 接下來,打開
myblog_project/urls.py,將blog應用的 URL 包含進來。# myblog_project/urls.py from django.contrib import admin from django.urls import path, include # 記得引入 include urlpatterns = [ path('admin/', admin.site.urls), path('', include('blog.urls')), # 將根路徑下的請求交給 blog.urls 處理 ]
創建模板
模板是 HTML 檔案,它包含一些特殊的標籤,用來動態地顯示視圖傳遞過來的數據。
-
創建模板目錄: Django 會在一個名為
templates的目錄中查找模板,為了避免模板名稱衝突,最佳實踐是在templates目錄下再創建一個與應用名稱相同的子目錄。 我們需要創建的路徑是:blog/templates/blog/。# 在終端機中執行 mkdir -p blog/templates/blog
-
編寫 HTML 模板: 在
blog/templates/blog/目錄下,創建一個名為post_list.html的檔案,並輸入以下內容:<!-- blog/templates/blog/post_list.html --> <!DOCTYPE html> <html lang="zh-Hant"> <head> <meta charset="UTF-8"> <title>我的部落格</title> </head> <body> <h1>文章列表</h1> <hr> {% for post in posts %} <article> <h2>{{ post.title }}</h2> <p>作者: {{ post.author.username }}</p> <p>發布時間: {{ post.created_at }}</p> <p>{{ post.content }}</p> <hr> </article> {% empty %} <p>暫無文章。</p> {% endfor %} </body> </html>說明:
{% for post in posts %}和{% endfor %}是 Django 的for標籤,用於循環遍歷posts列表。{{ post.title }}是 Django 的變量標籤,用於顯示變量的值。
測試前台頁面
現在,訪問 http://127.0.0.1:8000/,你應該能看到你在管理後台添加的文章列表了!
第四部分:動態頁面與用戶交互
創建文章詳情頁
我們希望點擊文章標題後,可以跳轉到文章的詳情頁。
-
更新 URL: 打開
blog/urls.py,添加一個新的 URL 路徑。# blog/urls.py from django.urls import path from . import views urlpatterns = [ path('', views.post_list, name='post_list'), # <int:pk> 是一個路徑轉換器,它會捕獲一個整數並作為參數傳遞給視圖 path('post/<int:pk>/', views.post_detail, name='post_detail'), ] -
更新視圖: 打開
blog/views.py,添加post_detail視圖,我們需要使用get_object_or_404來處理文章不存在時的情況。# blog/views.py from django.shortcuts import render, get_object_or_404 # 記得引入 get_object_or_404 from .models import Post def post_list(request): # ... (之前的程式碼保持不變) pass def post_detail(request, pk): # 根據 pk (主鍵) 獲取單篇文章,如果找不到則返回 404 錯誤頁面 post = get_object_or_404(Post, pk=pk) context = { 'post': post } return render(request, 'blog/post_detail.html', context) -
更新模板:
-
修改
post_list.html,讓標題可以點擊。<!-- blog/templates/blog/post_list.html 的 <h2> 標籤部分 --> <h2><a href="{% url 'post_detail' post.pk %}">{{ post.title }}</a></h2>{% url 'post_detail' post.pk %}會根據post_detail這個 URL 名稱和post.pk(文章的主鍵) 生成正確的 URL。 -
接著,創建
post_detail.html模板。<!-- blog/templates/blog/post_detail.html --> <!DOCTYPE html> <html lang="zh-Hant"> <head> <meta charset="UTF-8"> <title>{{ post.title }}</title> </head> <body> <a href="{% url 'post_list' %}"> ← 返回列表</a> <article> <h1>{{ post.title }}</h1> <p>作者: {{ post.author.username }}</p> <p>發布時間: {{ post.created_at }}</p> <div> <p>{{ post.content }}</p> </div> </article> </body> </html>
-
添加刪除功能
讓我們在詳情頁添加一個刪除按鈕。
-
更新 URL: 在
blog/urls.py中添加刪除的 URL。# blog/urls.py from django.urls import path from . import views urlpatterns = [ path('', views.post_list, name='post_list'), path('post/<int:pk>/', views.post_detail, name='post_detail'), path('post/<int:pk>/delete/', views.post_delete, name='post_delete'), ] -
更新視圖: 刪除操作是一個
POST請求,所以我們需要處理POST方法。# blog/views.py from django.shortcuts import render, get_object_or_404, redirect # 記得引入 redirect from .models import Post # ... (之前的程式碼保持不變) def post_delete(request, pk): post = get_object_or_404(Post, pk=pk) if request.method == 'POST': post.delete() # 刪除後重定向到文章列表頁 return redirect('post_list') # 如果是 GET 請求,可以顯示一個確認頁面 (這裡省略) return redirect('post_list') -
更新模板: 在
post_detail.html中添加一個刪除表單。<!-- blog/templates/blog/post_detail.html 的 <article> 標籤結束前添加 --> <form method="POST" action="{% url 'post_delete' post.pk %}" style="margin-top: 20px;"> {% csrf_token %} <!-- Django 安全機制,必須添加 --> <button type="submit" onclick="return confirm('確定要刪除這篇文章嗎?')">刪除文章</button> </form>method="POST": 表單使用 POST 方法提交。{% csrf_token %}: Django 的跨站請求偽造保護,所有 POST 表單都必須包含它。
第五部分:靜態文件與頁面美化
靜態文件包括 CSS、JavaScript 和圖片等,我們來為網站添加一些樣式。
-
創建靜態文件目錄: 和模板類似,我們在
blog應用下創建一個靜態文件目錄:blog/static/blog/。mkdir -p blog/static/blog
-
編寫 CSS: 在
blog/static/blog/目錄下,創建一個style.css檔案。/* blog/static/blog/style.css */ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.6; margin: 0; padding: 20px; background-color: #f4f4f4; color: #333; } h1, h2 { color: #0056b3; } article { background: #fff; padding: 20px; margin-bottom: 20px; border-radius: 5px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } a { color: #007bff; text-decoration: none; } a:hover { text-decoration: underline; } form button { background-color: #dc3545; color: white; border: none; padding: 10px 15px; border-radius: 5px; cursor: pointer; } form button:hover { background-color: #c82333; } -
在模板中引用 CSS: 修改
post_list.html和post_detail.html,在<head>標籤內添加對 CSS 檔案的引用。<!-- 在所有模板的 <head> 標籤內添加 --> <link rel="stylesheet" href="{% static 'blog/style.css' %}">{% static ... %}是 Django 的靜態文件模板標籤。- 你需要在模板頂部先載入它:
{% load static %}。
修改後的
post_list.html頂部如下:{% load static %} <!DOCTYPE html> <html lang="zh-Hant"> <head> <meta charset="UTF-8"> <title>我的部落格</title> <link rel="stylesheet" href="{% static 'blog/style.css' %}"> </head> <!-- ... 後面的內容 ... -->
現在,刷新你的頁面,網站應該會變得美觀很多!
第六部分:部署上線
將你的網站部署到公網上,讓任何人都可以訪問,這是一個比較複雜的過程,這裡提供一個簡化的概述。
主要步驟:
-
選擇雲端服務提供商:
- Heroku: 對初學者非常友好,有免費方案。
- PythonAnywhere: 專門為 Python Web 應用設計,也很適合初學者。
- AWS (Amazon Web Services), Google Cloud Platform (GCP), Azure: 功能強大但複雜,適合大型專案。
-
準備專案:
settings.py修改:- 將
DEBUG設為False。 - 將
ALLOWED_HOSTS設定為你的域名或 IP。 - 配置靜態文件,你需要一個專門的 URL 來提供靜態文件(使用
collectstatic命令將所有靜態文件收集到一個地方)。
- 將
requirements.txt: 創建一個requirements.txt檔案,列出所有依賴的 Python 套件。pip freeze > requirements.txt
- 環境變數:不要在
settings.py中硬編寫密碼或敏感資訊,應使用環境變數。
-
上傳代碼: 使用 Git 將你的代碼推送到 GitHub 或 GitLab,然後在雲端服務提供商上連接你的代碼庫。
-
配置和構建: 在雲端服務商的控制台中,配置你的 Web 伺服器(Gunicorn)、環境變數、數據庫等,然後部署。
由於部署步驟因平台而異,建議直接參考你所選平台官方的 Django 部署教學。
總結與進階學習資源
恭喜你!你已經成功地從零開始,使用 Django 建立了一個具有基本功能的部落格網站,你學到了 Django 的核心概念:MTV 架構、模型、視圖、URL、模板、後台管理和靜態文件。
接下來可以學什麼?
-
用戶系統:
- 學習如何使用 Django 自帶的
auth應用來實現用戶註冊、登入、登出。 - 學習如何保護視圖,只有登入用戶才能訪問。
- 學習如何使用 Django 自帶的
-
表單處理:
- 學習使用 Django 的
Form和ModelForm來創建和驗證用戶提交的表單,例如發表新文章的表單。
- 學習使用 Django 的
-
分頁:
當文章很多時,學習如何使用 Django 的分�件來將文章列表分成多頁顯示。
-
Class-Based Views (CBV):
學習使用基於類的視圖,它們是函數式視圖的強大替代品,能讓你的代碼更簡潔、更具可重用性。
-
REST Framework:
如果你想建立 API 來讓手機 App 或其他前端框架(如 Vue.js, React)與你的後端互動,Django REST Framework 是必學的。
推薦學習資源
- 官方文檔 (Django Documentation):https://docs.djangoproject.com/zh-hans/ (永遠是最好的資源)
- Django Girls Tutorial:https://tutorial.djangogirls.org/zh/ (非常適合女性的入門教程,但對所有初學者都很有價值)
- Real Python - Django Tutorials:https://realpython.com/tutorials/django/ (高品質的免費和付費教程)
- Stack Overflow:當你遇到問題時,這裡是尋找答案的最佳地方。
持續學習,不斷實踐,你會越來越熟悉 Django!
