render是指渲染模板(template)的意思,一開始還真覺得抽象,渲染不是畫畫才會用到的名詞XD,還是直接看例子比較快:
from django.shortcuts import render
import datetime
def homepage(request):
now = datetime.datetime.now() # 現在時間
context = {'now':now}
return render(request, 'homepage.html', context)
render的必要參數有:
✦ request
✦ template_name:要使用的網頁模版。
另外這個範例還加了一個非必要參數:
✦ context:必須是dictionary。
這邊看一下homepage.html,兩個大括號是固定用法,中間就放context的key:
<html>
...省略
<h3>{{ now }}</h3>
redirect裡面放url參數,目的是要跳轉到這個網址去,舉例來說:
def my_view(request):
...
return redirect('/quiz/')
執行my_view,瀏覽器就會跳轉到 http://127.0.0.1:8000/quiz 。
另外有一種情況是,想把某個view的變數傳到另一個view時,可藉由用Django內建的APP Session輕鬆達成:
def my_view(request):
...
link = request.POST['link'] #要傳送的變數
request.session['link'] = link #透過django內建的session app
return redirect('another_view') #redirect裡面的參數放view的名稱
def another_view(request):
obj = request.session.get('link')
...
假設透過another_view可以在網頁上上傳影片,但希望每支影片有自己的網址,一樣使用redirect的方式:
#原先的urls.py
urlpatterns = [
...
path('upload/', views.another_view, name='upload'),
]
#變成動態網址的urls.py
urlpatterns = [
...
path('upload/<video_id>/', views.another_view, name='upload'),
]
調整views.py:
def my_view(request):
...
link = request.POST['link'] #要傳送的變數
video_id = ... #這邊就依需求來定義
request.session['link'] = link #透過django內建的session app
return redirect('another_view', video_id=video_id) #redirect裡面的參數放view的名稱
def another_view(request, video_id): #加上了參數video_id
obj = request.session.get('link')
...
小結:兩者最明顯的差異在於redirect並不對樣板做任何影響,只是導引到另一個頁面,而render則是可以去變化模板的內容。
覺得到views的階段,多熟悉兩者的使用及處理HTTP請求和響應相關辦法,實作小專案也綽綽有餘了。