跳轉到

GET 參數

開始之前

任務目標

在這個章節中,我們會完成:

  • 了解什麼是 GET 參數
  • 使用 GET 參數傳遞資料
  • 處理多值參數

什麼是 GET 參數?

GET 參數是 URL 中 ? 後面的部分,通常用於篩選、搜尋、分頁等功能。

以這個網址為例:

/products/?category=electronics&sort=price&page=2
          └──────────────────┬──────────────────┘
                          GET 參數

GET 參數的格式是 key=value,多個參數用 & 連接。

基本用法

步驟 1:建立 View

practices/views.py
from django.http import HttpResponse
from django.shortcuts import render


def hello_world(request):
    return render(request, "practices/hello.html")


def greeting(request):
    name = "Django"
    return render(request, "practices/greeting.html", {"name": name})


def search(request):
    keyword = request.GET.get("q", "")
    return HttpResponse(f"Keyword: {keyword}")

步驟 2:設定 URL

practices/urls.py
from django.urls import path

from practices import views

urlpatterns = [
    path("hello/", views.hello_world, name="hello_world"),
    path("greeting/", views.greeting, name="greeting"),
    path("search/", views.search, name="search"),
]

步驟 3:測試

訪問 http://127.0.0.1:8000/practices/search/?q=django 會顯示 Keyword: django

試試看:

  • /practices/search/?q=pythonKeyword: python
  • /practices/search/keyword: (沒有參數時顯示預設值)

取得 GET 參數的方法

方法 說明 範例
request.GET.get("key") 取得單一值,不存在時回傳 None request.GET.get("q")
request.GET.get("key", default) 取得單一值,不存在時回傳預設值 request.GET.get("q", "")
request.GET["key"] 取得單一值,不存在時拋出 KeyError request.GET["q"]
request.GET.getlist("key") 取得多個值(回傳 list) request.GET.getlist("tags")

建議使用 get() 方法

使用 get() 方法可以避免 KeyError,並且可以設定預設值。

# 推薦
keyword = request.GET.get("q", "")

# 不推薦(可能拋出 KeyError)
keyword = request.GET["q"]

多個 GET 參數

practices/views.py
from django.http import HttpResponse
from django.shortcuts import render


def hello_world(request):
    return render(request, "practices/hello.html")


def greeting(request):
    name = "Django"
    return render(request, "practices/greeting.html", {"name": name})


def search(request):
    keyword = request.GET.get("q", "")
    return HttpResponse(f"Keyword: {keyword}")


def product_list(request):
    category = request.GET.get("category", "all")
    sort = request.GET.get("sort", "newest")
    page = request.GET.get("page", "1")

    return HttpResponse(f"分類: {category}, 排序: {sort}, 頁數: {page}")
practices/urls.py
from django.urls import path

from practices import views

urlpatterns = [
    path("hello/", views.hello_world, name="hello_world"),
    path("greeting/", views.greeting, name="greeting"),
    path("search/", views.search, name="search"),
    path("products/", views.product_list, name="product_list"),
]

訪問 http://127.0.0.1:8000/practices/products/?category=electronics&sort=price&page=2 會顯示:

分類: electronics, 排序: price, 頁數: 2

處理多值參數

當同一個參數有多個值時(如多選),使用 getlist()

practices/views.py
from django.http import HttpResponse
from django.shortcuts import render


def hello_world(request):
    return render(request, "practices/hello.html")


def greeting(request):
    name = "Django"
    return render(request, "practices/greeting.html", {"name": name})


def search(request):
    keyword = request.GET.get("q", "")
    return HttpResponse(f"Keyword: {keyword}")


def product_list(request):
    category = request.GET.get("category", "all")
    sort = request.GET.get("sort", "newest")
    page = request.GET.get("page", "1")

    return HttpResponse(f"分類: {category}, 排序: {sort}, 頁數: {page}")


def filter_products(request):
    colors = request.GET.getlist("color")
    return HttpResponse(f"選擇的顏色: {', '.join(colors)}")
practices/urls.py
from django.urls import path

from practices import views

urlpatterns = [
    path("hello/", views.hello_world, name="hello_world"),
    path("greeting/", views.greeting, name="greeting"),
    path("search/", views.search, name="search"),
    path("products/", views.product_list, name="product_list"),
    path("products/filter/", views.filter_products, name="product_filter"),
]

訪問 http://127.0.0.1:8000/practices/products/filter/?color=red&color=blue&color=green 會顯示:

選擇的顏色: red, blue, green

任務結束

完成!

恭喜你完成了這個章節!現在你已經:

  • 了解什麼是 GET 參數
  • 使用 GET 參數傳遞資料
  • 處理多值參數