Django 系列- 如何在 template 以及 view.py 中獲取當下/前一頁頁面的url?

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}}

結果為:

https://chilunhuang.github.io/posts/52152/#toc-heading-5

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 相關的一些語法介紹,這裡面的水其實蠻深的,也有很多有趣的東西,有興趣的讀者可以自己好好的玩玩!

參考資料

官方文件:

https://docs.djangoproject.com/en/3.1/ref/request-response/

stackoverflow:

https://stackoverflow.com/questions/2882490/how-to-get-the-current-url-within-a-django-template

若有任何問題與指教歡迎與我聯繫,若覺得我的內容不錯麻煩幫我隨便點個廣告,謝謝。


 上一篇
登山系列-玉山一日單攻(主峰)攻略&紀錄 登山系列-玉山一日單攻(主峰)攻略&紀錄
玉山一日單攻(主峰)攻略&紀錄登上玉山的計畫從 2020/03 就開始了,但是可以的時間都一直抽不到簽,超級沒有籤運QQ,與排雲山莊非常的沒有緣分,只好開始準備玉山一日單攻抽籤。很幸運的在8月改制後(先搶先贏改成電腦選)就中籤了,也
2020-10-08
下一篇 
Django 系列- 如何在清單中截斷、縮短(truncatechars)顯示的文章文字? Django 系列- 如何在清單中截斷、縮短(truncatechars)顯示的文章文字?
How to use truncate filter to slice text of Django template tag?在本範例你會學到: 部落格或網誌的文章清單中簡短顯示內容 Django filters(過濾器) 的使用 t
2020-08-23
  目錄