杰瑞科技汇

Django教材如何快速入门Python开发?

Django 完整學習路線圖 (從零到一個部落格)

這份教材將分為以下幾個部分:

Django教材如何快速入门Python开发?-图1
(图片来源网络,侵删)
  1. 前置準備:環境搭建 - 安裝 Python 和虛擬環境。
  2. 第一部分:Django 入門 - 創建第一個 Django 專案和應用。
  3. 第二部分:數據模型與管理後台 - 定義數據庫結構,並使用 Django 自動生成的管理後台。
  4. 第三部分:視圖、URL 與模板 - 實現動態頁面,展示數據給用戶。
  5. 第四部分:動態頁面與用戶交互 - 實現文章詳情頁、列表頁和刪除功能。
  6. 第五部分:靜態文件與頁面美化 - 添加 CSS 和 JavaScript,讓網站看起來更專業。
  7. 第六部分:部署上線 - 將你的網站發佈到網路上。
  8. 總結與進階學習資源 - 接下來可以學什麼?

前置準備:環境搭建

在開始之前,你需要安裝 Python,請確認你的電腦上已經安裝了 Python 3.6 或更高版本,你可以在終端機(Terminal 或 Command Prompt)輸入以下指令檢查:

python --version

推薦:使用虛擬環境

為了避免不同專案之間的套件版本衝突,我們強烈建議為每個專案創建一個獨立的「虛擬環境」。

  1. 進入你的專案目錄

    Django教材如何快速入门Python开发?-图2
    (图片来源网络,侵删)
    # 創建一個資料夾用來存放所有你的 Django 專案
    mkdir django_projects
    cd django_projects
  2. 創建虛擬環境: 我們使用 venv 這個 Python 內建的模組。

    # myblog 是虛擬環境的名稱,你可以隨意取
    python -m venv myblog
  3. 啟用虛擬環境

    • macOS / Linux:
      source myblog/bin/activate
    • Windows:
      .\myblog\Scripts\activate

      啟用後,你的終端機提示字元前面會出現 (myblog),表示你已經在虛擬環境中了。

  4. 安裝 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 的遷移系統可以將你對模型的更改同步到數據庫中。

  1. 生成遷移檔案

    python manage.py makemigrations blog

    這會在 blog/migrations/ 目錄下生成一個新的遷移檔案。

  2. 應用遷移

    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

按照提示輸入你想要的用戶名、電子郵箱和密碼。

測試管理後台

  1. 確保你的開發伺服器正在運行 (python manage.py runserver)。
  2. 在瀏覽器中訪問 http://127.0.0.1:8000/admin/
  3. 使用你剛剛創建的超級用戶帳號登入。
  4. 你會看到一個 "Authentication and Authorization" 區塊,點擊 "Posts"。
  5. 點擊 "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 路徑映射到對應的視圖函數。

  1. 在應用內創建 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'),
    ]
  2. 在專案中包含應用 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 檔案,它包含一些特殊的標籤,用來動態地顯示視圖傳遞過來的數據。

  1. 創建模板目錄: Django 會在一個名為 templates 的目錄中查找模板,為了避免模板名稱衝突,最佳實踐是在 templates 目錄下再創建一個與應用名稱相同的子目錄。 我們需要創建的路徑是:blog/templates/blog/

    # 在終端機中執行
    mkdir -p blog/templates/blog
  2. 編寫 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/,你應該能看到你在管理後台添加的文章列表了!


第四部分:動態頁面與用戶交互

創建文章詳情頁

我們希望點擊文章標題後,可以跳轉到文章的詳情頁。

  1. 更新 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'),
    ]
  2. 更新視圖: 打開 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)
  3. 更新模板

    • 修改 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' %}"> &larr; 返回列表</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>

添加刪除功能

讓我們在詳情頁添加一個刪除按鈕。

  1. 更新 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'),
    ]
  2. 更新視圖: 刪除操作是一個 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')
  3. 更新模板: 在 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 和圖片等,我們來為網站添加一些樣式。

  1. 創建靜態文件目錄: 和模板類似,我們在 blog 應用下創建一個靜態文件目錄:blog/static/blog/

    mkdir -p blog/static/blog
  2. 編寫 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;
    }
  3. 在模板中引用 CSS: 修改 post_list.htmlpost_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>
    <!-- ... 後面的內容 ... -->

現在,刷新你的頁面,網站應該會變得美觀很多!


第六部分:部署上線

將你的網站部署到公網上,讓任何人都可以訪問,這是一個比較複雜的過程,這裡提供一個簡化的概述。

主要步驟:

  1. 選擇雲端服務提供商

    • Heroku: 對初學者非常友好,有免費方案。
    • PythonAnywhere: 專門為 Python Web 應用設計,也很適合初學者。
    • AWS (Amazon Web Services), Google Cloud Platform (GCP), Azure: 功能強大但複雜,適合大型專案。
  2. 準備專案

    • settings.py 修改
      • DEBUG 設為 False
      • ALLOWED_HOSTS 設定為你的域名或 IP。
      • 配置靜態文件,你需要一個專門的 URL 來提供靜態文件(使用 collectstatic 命令將所有靜態文件收集到一個地方)。
    • requirements.txt: 創建一個 requirements.txt 檔案,列出所有依賴的 Python 套件。
      pip freeze > requirements.txt
    • 環境變數:不要在 settings.py 中硬編寫密碼或敏感資訊,應使用環境變數。
  3. 上傳代碼: 使用 Git 將你的代碼推送到 GitHub 或 GitLab,然後在雲端服務提供商上連接你的代碼庫。

  4. 配置和構建: 在雲端服務商的控制台中,配置你的 Web 伺服器(Gunicorn)、環境變數、數據庫等,然後部署。

由於部署步驟因平台而異,建議直接參考你所選平台官方的 Django 部署教學。


總結與進階學習資源

恭喜你!你已經成功地從零開始,使用 Django 建立了一個具有基本功能的部落格網站,你學到了 Django 的核心概念:MTV 架構、模型、視圖、URL、模板、後台管理和靜態文件。

接下來可以學什麼?

  1. 用戶系統

    • 學習如何使用 Django 自帶的 auth 應用來實現用戶註冊、登入、登出。
    • 學習如何保護視圖,只有登入用戶才能訪問。
  2. 表單處理

    • 學習使用 Django 的 FormModelForm 來創建和驗證用戶提交的表單,例如發表新文章的表單。
  3. 分頁

    當文章很多時,學習如何使用 Django 的分�件來將文章列表分成多頁顯示。

  4. Class-Based Views (CBV)

    學習使用基於類的視圖,它們是函數式視圖的強大替代品,能讓你的代碼更簡潔、更具可重用性。

  5. REST Framework

    如果你想建立 API 來讓手機 App 或其他前端框架(如 Vue.js, React)與你的後端互動,Django REST Framework 是必學的。

推薦學習資源

持續學習,不斷實踐,你會越來越熟悉 Django!

分享:
扫描分享到社交APP
上一篇
下一篇