Views
View 是實際處理請求、決定回傳內容的程式碼。Django 的 View 有兩種寫法:Function-Based Views(FBV),也就是這一頁介紹的一般函式;以及 Class-Based Views(CBV),把邏輯包裝成類別,內建許多常見樣板可以繼承,詳見 Class-Based Views。兩種寫法功能上等價,FBV 直覺、彈性高,CBV 則能減少重複程式碼,實務上經常混用。
官方文件:Writing views。
Function-Based View 範例
View 本質上是一個接收 request 物件、回傳 HttpResponse(或其子類別)的 Python 函式:
# views.py
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
對應的 urls.py 把網址交給這個函式處理:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path("current_datetime/", views.current_datetime),
]
常見回傳方式
實務上很少像上面手拼 HTML 字串,常見的三種回傳方式:
render(request, "template.html", context):套用 Template 並回傳 HTML,最常用。redirect("some-view-name"):回傳 302 導向,常用於表單送出成功後。HttpResponse(...)/JsonResponse(...):直接回傳文字或 JSON,適合 API 或簡單回應。
from django.shortcuts import render, redirect
def home(request):
posts = Post.objects.all()
return render(request, "myapp/home.html", {"posts": posts})
請求物件 request
request 是 View 的第一個參數,帶著這次請求的所有資訊,最常用到:
| 屬性 | 說明 |
|---|---|
request.method |
HTTP 方法,例如 "GET"、"POST" |
request.GET |
查詢字串參數(?key=value) |
request.POST |
表單送出的資料 |
request.user |
目前登入的使用者(需搭配驗證中介層) |