原本今天是要進入Template的,不過因為昨天存檔不見,所以今天會把昨天要講的Redirect,明天再進入Template。
來到Views想談的最後一個部分,不知道大家在使用網頁或開發時,有沒有遇到過會自動跳轉到其他page的時候。
比較常見的場景是當你登入帳密驗證成功後,進入時就會自動幫你轉到特定頁面。
這時候使用的就是重新定址的方法,在Django中,重新定址常見的方法有三種。
這個方法主要是透過給予他網址來進行重新定址。
首先我們在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。
第二種方法則是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的方法,這個方法算是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