iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
2
Modern Web

Django案例實作之踩坑全記錄系列 第 14

Django - render, redirect (補充)

  • 分享至 

  • xImage
  •  

render()

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()

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請求和響應相關辦法,實作小專案也綽綽有餘了。


上一篇
Django - views
下一篇
Django - template (ㄧ)
系列文
Django案例實作之踩坑全記錄34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言