How to get current url in template or view.py?
在本範例你會學到:
- 如何獲取當下頁面的 url
- 如何獲取前一頁面的 url (referrer)
在本範例你需要先準備好:
- 可以使用 Django的環境或簡單範例
- 本環境測試使用
Django==3.0.7
以上(含)
1.在 template 中
在 template 裡面有基本的三種使用方式,要依照網頁架構跟需求使用:
假設以本站的某一篇文章為例子:
https://chilunhuang.github.io/posts/52152/#toc-heading-5
第一種去頭去尾(拿掉 http/https 以及 get 相關參數):
{{request.path}}
結果為:
/posts/52152/
第二種去頭(拿掉 http/https):
{{request.get_full_path}}
結果為:
/posts/52152/#toc-heading-5
第三種完整 url:
{{request.build_absolute_uri}}
結果為:
2.在 view.py 中
其實基本上剛剛上面 template 的例子全部也都可以直接使用在 view.py 當中喔,只要把 {{}}
拿掉就可以使用了,request
大家應該也相對的很熟悉了,每一段 function 都要使用啊!
就像下面判斷 GET/POST 的小範例一樣的用法:
if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()
獲取方式就是下面這樣:
request.build_absolute_uri
3.取得前一頁網址(referrer)
這一段要介紹一個別東西: HttpRequest.META
這個 library 可以獲取很多額外的資訊,例如:
- client’s user-agent
- The IP address of the client.
- The hostname of the client.
- …
更多功能請見官網:
https://docs.djangoproject.com/en/3.1/ref/request-response/#django.http.HttpRequest.META
這裡就示範我最常用的導回前一頁的功能,大家可能會想怎麼會有這個需求呢?通常填完表單就讓他再回到表單頁就好,那就簡單的 redirect 到 request.build_absolute_uri
就好,幹嘛需要 referrer
?
這麼做的原因是有些表單填完送出後是沒有真實頁面存在的,他就直接 call view.py 去執行相關的動作後就會結束,如果我倒回原來的頁面,網址其實是不對的,是不是很抽象?我來舉個例子:
假設我在 https://chilunhuang.github.io/
有個表單,該表單是讓大家寄信問問題,送出後就會直接寄信給我以及 user,但該表單並沒有一個獨立頁面,而是嵌在 https://chilunhuang.github.io/
,當表單送出時會導向一個頁面(send_gmail/
),以及執行已經在 view.py 中定義的 func(send_gmail
)
# 在 urls.py 中
path('send_gmail/', send_gmail, name='send_gmail')
執行完畢後直接使用 request.build_absolute_uri
回到該頁面就會導向 send_gmail/
這個不存在的頁面去!所以才會有導向 referrer
的需求,那該如何是好呢?可以使用以下的語法(HTTP_REFERER
):
HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
使用上面的這個方法就可以直接回到 send_gmail/
前一頁的 https://chilunhuang.github.io/
!
以上為簡單的與 url path 相關的一些語法介紹,這裡面的水其實蠻深的,也有很多有趣的東西,有興趣的讀者可以自己好好的玩玩!
參考資料
官方文件:
stackoverflow:
https://stackoverflow.com/questions/2882490/how-to-get-the-current-url-within-a-django-template
若有任何問題與指教歡迎與我聯繫,若覺得我的內容不錯麻煩幫我隨便點個廣告
,謝謝。