iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
自我挑戰組

從0 到 50 初探 如何使用Django 架構出一個網站系列 第 8

Day-8 -Urls and Views -path 也能傳遞變數? - Dynamic path

  • 分享至 

  • xImage
  •  

前言

嗨嗨大家,又是新的一天,我們今天要延續昨天所寫的頁面,並進行優化,那我們就開始啦!

dictionary的應用

延續昨天我們所寫的程式碼,今天要針對他們來做更進一步的修改,可以看到我們昨天所寫的首頁、關於我們和門市資訊的頁面,是單純用function的方式來呈現。但是如果function一多就會像下面一樣會有好幾行,因此我們可以用不同的方法來進行調整。

#Django_app/views.py

from django.shortcuts import render
from django.http import HttpResponse

def aboutus(request):
    return HttpResponse("關於我們")

def storeinfo(request):
    return HttpResponse("門市資訊")

首先我們在views.py裡,我們可以嘗試先建立一個page的dictionary,並將原本的Response內容改為用dictionary的key來呈現。這時候可以再去查看aboutus和storeinfo一樣可以運作。但這樣做反而需要多建立一個page,因此我們要Dynamic URL Patterns 的方法來達到更好的效率。

#Django_app/views.py

from django.shortcuts import render
from django.http import HttpResponse

page = {
    "aboutus": "關於我們",
    "storeinfo": "門市資訊",
    "News":"新聞"
}

def aboutus(request):
    return HttpResponse(page["aboutus"])

def storeinfo(request):
    return HttpResponse(page["storeinfo"])

Dynamic URL Patterns

那要如何實現Dynamic URL Patterns 呢?
這就要說到path裡的ROUTE參數,Django提供了很方便的方法,讓ROUTE的參數不僅可以當作網址,還能傳遞給views.py的函式裡。
我們先回到urls.py裡,並將原本的path刪掉,輸入以下程式碼。
可以看到有一個,在path被解析時,這裡在<>裡的值可以當做參數做傳遞,並傳到view。

Django_app/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('<content>/', views.pagecontent)
]

除此以外在<>變數前面可以利用<[data type]:[variable]>來做定義,若符合條件才會進入。
例如我們可以在content前面加str,來限制進入的參數。

Django_app/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('<str:content>/', views.pagecontent)
]

接著我們需要建立新的函式來接收我們剛剛建立的content。
因此,我們把原本多個函式都刪除,改建立一個pagecontent,並接收content。
讓網址的設定隨著用戶端(client)輸入的網址而改變要去的頁面。

Django_app/views.py

from django.shortcuts import render
from django.http import HttpResponse

page = {
    "aboutus": "關於我們",
    "storeinfo": "門市資訊",
    "News":"新聞"
}

def pagecontent(request, content):
    return HttpResponse(page[content])

views和urls 串接的方式

https://ithelp.ithome.com.tw/upload/images/20220915/20150927uRld7ATpDw.png

小提醒:要記得接收和傳送使用的名稱要是一樣的,要不然會接收不到。
我們再回到網頁去查看

https://ithelp.ithome.com.tw/upload/images/20220915/20150927TbuSU52Zeu.pnghttps://ithelp.ithome.com.tw/upload/images/20220915/20150927E1GGEHpECT.png

這樣就完成囉!
應用這種方法也能寫有趣的小功能,例如用網址計算BMI:

views.py

def calBMI(request, height, weight):
    result = weight/((height/100)**2)
    return HttpResponse(f"您的BMI為{round(result,2)}")

urls.py

path('<int:height>/<int:weight>', views.calBMI)

BMI呈現畫面

https://ithelp.ithome.com.tw/upload/images/20220915/20150927LJOeFuBCxh.png
就能利用網址的方式來計算BMI啦!是不是很有趣呢?
那我們今天就到這裡,明天見囉!

參考資料&推薦閱讀

https://docs.djangoproject.com/en/4.1/topics/http/urls/


上一篇
Day7 -URLS and Views -Function Views
下一篇
Day9 - Urls and Views - 404 Not Found
系列文
從0 到 50 初探 如何使用Django 架構出一個網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言