iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0

前言

原本今天是要進入Template的,不過因為昨天存檔不見,所以今天會把昨天要講的Redirect,明天再進入Template。

Redirect URL

來到Views想談的最後一個部分,不知道大家在使用網頁或開發時,有沒有遇到過會自動跳轉到其他page的時候。
比較常見的場景是當你登入帳密驗證成功後,進入時就會自動幫你轉到特定頁面。
這時候使用的就是重新定址的方法,在Django中,重新定址常見的方法有三種。

HttpResponseRedirect()

這個方法主要是透過給予他網址來進行重新定址。
首先我們在views.py中新建一個redirect的函式接著再去urls.py 新增一個dynamic path,並將參數型態設為int,這裡的意思就是當進入/hello 時,若後面為整數則會連接到/hello/aboutus。
這個方法主要也可以接受網址直接寫在裡面,如 HttpResponseRedirect('http://127.0.0.1:8000/hello/aboutus')這種方式。

#views.py
...
def redirect_(request,var):
    return HttpResponseRedirect('/hello/aboutus')
#urls.py
...
urlpatterns = [
    path('<int:var>/', views.redirect_),
    path('<int:height>/<int:weight>', views.calBMI),
    path('<str:content>/', views.pagecontent, name = 'view_content'),
]

我們在HttpResponseRedirect內要轉向的網址,必須要在前面加/ Django才會知道是在網域名後面進行轉向,否則若如果我們今天寫成下面這樣,少了斜線

...
def redirect_(request,var):
    return HttpResponseRedirect('hello/aboutus')

我們就會看到下圖這樣,變成連到 hello/0/hello/aboutus。
https://ithelp.ithome.com.tw/upload/images/20220917/201509276b3e15LVNb.png

Reverse()

第二種方法則是Reverse,相比 HttpResponseRedirect()只能用網址做為連接方式,Reverse 是使用 path name的方式來做連接,還記得我們之前在path有提到的name嗎? 在這裡就能做使用。
首先我們先幫我們的path取名為'view_content',就可以在reverse中直接呼叫他,reverse 如果需要傳遞參數的話可以用args,就會將參數傳遞到名字為view_content的頁面,若不需要傳遞參數,則直接傳到那個路徑的名字即可。

#urls.py
...
urlpatterns = [
    path('<int:var>/', views.redirect_),
    path('<int:height>/<int:weight>', views.calBMI),
    path('<str:content>/', views.pagecontent, name = 'view_content'),
]
#views.py
...
def redirect_(request,var):
    p = reverse('view_content', args = ['aboutus'])
    return HttpResponseRedirect(p)

redirect()

最後是redirect的方法,這個方法算是HttpResponseRedirect()和Reverse()的合體。
不僅可以使用HttpResponseRedirect()的方式,也能利用reverse來做名字的呼叫,除此以外,還能夠使用view的名字和物件進行重新定址。

#1.一般靜態定址
def redirect_(request,var):
    ...
    return redirect('/hello/News')

#2.直接導向網址
def redirect_(request,var):
    ...
    return redirect('http://127.0.0.1:8000/hello/News/')
    
#3.配合reverse 做使用   
def redirect_(request,var):
    ...
    return redirect(reverse('view_content', args=['News']))

#4.用view的名字並傳遞參數
def redirect_(request,var):
    ...
    return redirect("view_content", content = "News")

如果我們今天想要用到Dynamic path來達到多個定址,可以在views.py內修改,這樣修改完之後,就能讓不同index的情況下重新定址到不同的網址。

...
def redirect_(request,var):
    page_list = list(page.keys())
    re = page_list[var]
    return redirect("view_content", content = re)

到今天為止,我們view的部分談得差不多了,明天我們將會開始談談另一個重要的元素 Template,我們明天見囉!

參考資料和推薦閱讀

官方文件:reverse
官方文件:HttpResponseRedirect
官方文件:redirect


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

尚未有邦友留言

立即登入留言