Django 系列- 如何在清單中截斷、縮短(truncatechars)顯示的文章文字?

How to use truncate filter to slice text of Django template tag?

在本範例你會學到:

  • 部落格或網誌的文章清單中簡短顯示內容
  • Django filters(過濾器) 的使用
    • truncatechars
    • truncatechars_html
    • truncatewords
    • 附贈 slice

在本範例你需要先準備好:

  • 可以使用 Django的環境或簡單範例
  • 本環境測試使用 Django==3.0.7 以上(含)

在官方文件中也解釋得蠻清楚的,我就簡單的帶過所有可以使用的相關語法:

1. truncatechars

truncatechars從字面上的意思也很好理解,使用方式如下:

{{ value|truncatechars:7 }}

結果如下圖,可以看出他秀出了六個字<p>這是一…,這個例子可以看出兩個小結論:

  • Filters 後面所寫的數字會自動 -1,我是填 7,但只出現 6 個
  • 如果文章儲存的方式是直接存入整個 html,這樣其他 tag 也會被算入
  • 使用這個體系的 filters 會自動地在結尾上面加上 ...

針對第二點,Django filters 也有相對應的解決方式,請繼續看下去!

結果

2. truncatechars_html

直接上範例:

{{ value| truncatechars_html:7 }}

這時候大家應該有發現,這次 filter 自動忽略了 tag <p>...</p>,直接抓取了中間的六個文字!

小提醒:如果不想要顯示 html 出現在頁面上,在要語法後面加上safe:

{{ value| truncatechars_html:7|safe }}

結果

3. truncatewords(中文不適用)

這個字面上看起來好理解,但他卻不適用在中文上面喔!他會針對句子中的標點符號或是空白來斷字,這個方式對英語系的才會有效果,中文會變得非常奇怪,變成整段字都會回傳!

4. truncatewords_html(中文不適用)

truncatewords相同,不適用於中文,與上面的差別就是 html tag 會被忽略計算。

5. 同場加碼 slice

slice這個方法是我還沒發現 truncat 體系時最常使用切割字串的方式,不過他就不會自動加上 ...了。

他比較特別的是有點像 python List [:] 的用法,可以指定前後的位置:

{{ some_list|slice:"0:2" }}

特別的是他與 python 相同,是從 0 開始計算位置,但不能使用 -1

結果

參考資料

truncatechars: https://docs.djangoproject.com/en/3.1/ref/templates/builtins/#truncatechars

slice: https://docs.djangoproject.com/en/3.1/ref/templates/builtins/#slice

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


 上一篇
Django 系列- 如何在 template 以及 view.py 中獲取當下/前一頁頁面的url? Django 系列- 如何在 template 以及 view.py 中獲取當下/前一頁頁面的url?
How to get current url in template or view.py?在本範例你會學到: 如何獲取當下頁面的 url 如何獲取前一頁面的 url (referrer) 在本範例你需要先準備好: 可以使用 Djan
2020-08-23
下一篇 
Python 系列- 如何乾淨移除網址url中的追蹤碼? Python 系列- 如何乾淨移除網址url中的追蹤碼?
How to remove/parse utm tags from urls to get clean url in python?在本範例你會學到: 如何使用 python 得到乾淨的 url 使用 urllib.parse 移除不想要
2020-07-06
  目錄