文章

Django - 視圖與模板

今天我們將學習 Django 的視圖與模板,學會如何處理用戶請求並返回動態生成的 HTML 頁面。


課程目標

  • 瞭解 Django 視圖的作用與類型。
  • 學會在視圖中處理業務邏輯並返回響應。
  • 使用模板系統生成動態 HTML 頁面。

課程內容

1. Django 視圖概述

1.1 視圖的作用

  • Django 中的視圖負責處理用戶請求並返回響應。
  • 視圖可以是函數或類,根據業務邏輯處理資料並與模板結合生成結果。

1.2 視圖的類型

  1. 基於函數的視圖 (Function-Based Views, FBV)

    • 使用簡單的函數實現業務邏輯。
    • 範例:

      1
      2
      3
      4
      
      from django.http import HttpResponse
      
      def hello_view(request):
          return HttpResponse("Hello, World!")
      
  2. 基於類的視圖 (Class-Based Views, CBV)

    • 使用類來實現視圖,結構更清晰。
    • 範例:

      1
      2
      3
      4
      5
      6
      
      from django.views import View
      from django.http import HttpResponse
      
      class HelloView(View):
          def get(self, request):
              return HttpResponse("Hello, World!")
      

2. 模板系統概述

2.1 模板的作用

  • Django 的模板系統用於生成動態 HTML 頁面,支持變數插值和模板語法。

2.2 模板的存放位置

  • 預設模板目錄在 settings.py 中由 TEMPLATES 配置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [BASE_DIR / 'templates'],  # 自定義模板目錄
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    

3. 視圖與模板的整合

3.1 範例:使用函數型視圖

  1. 編輯視圖 (views.py)

    1
    2
    3
    4
    5
    6
    7
    8
    
    from django.shortcuts import render
    
    def index(request):
        context = {
            'title': '歡迎來到 Django 課程',
            'message': '這是一個視圖與模板的範例。',
        }
        return render(request, 'index.html', context)
    
  2. 建立模板 (templates/index.html)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>{{ title }}</title>
      </head>
      <body>
        <h1>{{ title }}</h1>
        <p>{{ message }}</p>
      </body>
    </html>
    
  3. 設定路由 (urls.py)

    1
    2
    3
    4
    5
    6
    
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.index, name='index'),
    ]
    
  4. 訪問頁面


3.2 範例:使用類型視圖

  1. 定義類型視圖 (views.py)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    from django.views.generic import TemplateView
    
    class IndexView(TemplateView):
        template_name = 'index.html'
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['title'] = '歡迎來到 Django 課程'
            context['message'] = '這是一個類型視圖的範例。'
            return context
    
  2. 設定路由 (urls.py)

    1
    2
    3
    4
    5
    6
    
    from django.urls import path
    from .views import IndexView
    
    urlpatterns = [
        path('', IndexView.as_view(), name='index'),
    ]
    

4. 模板語法功能

4.1 變數插值

  • 使用雙大括號 {{ }} 插入變數:
    1
    
    <p>用戶名:{{ user.username }}</p>
    

4.2 條件語句

  • 使用 {% if %} 判斷邏輯:
    1
    2
    3
    4
    5
    
    {% if user.is_authenticated %}
    <p>歡迎回來,{{ user.username }}!</p>
    {% else %}
    <p>請先登入。</p>
    {% endif %}
    

4.3 循環

  • 使用 {% for %} 進行迭代:
    1
    2
    3
    4
    5
    
    <ul>
      {% for item in items %}
      <li>{{ item }}</li>
      {% endfor %}
    </ul>
    

4.4 繼承模板

  1. 母模板 (base.html)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <title>{% block title %}Django 課程{% endblock %}</title>
      </head>
      <body>
        <header>
          <h1>我的網站</h1>
        </header>
        <main>{% block content %}{% endblock %}</main>
        <footer>
          <p>版權所有 © 2024</p>
        </footer>
      </body>
    </html>
    
  2. 子模板 (index.html)

    1
    2
    3
    4
    5
    
    {% extends 'base.html' %} {% block title %}首頁{% endblock %} {% block
    content %}
    <h2>{{ title }}</h2>
    <p>{{ message }}</p>
    {% endblock %}
    

5. 本日總結

  • 學習 Django 視圖的作用與類型。
  • 瞭解模板系統如何生成動態 HTML 頁面。
  • 實現基於視圖與模板的簡單頁面展示。

作業

  1. 為應用新增一個 /about/ 頁面,介紹你的應用功能,並使用模板繼承。
  2. 嘗試在模板中使用 {% for %}{% if %} 展示條件內容或列表。

本文章以 CC BY 4.0 授權