摘要:我們的博客側邊欄有四項內容最新文章歸檔分類和標簽云。更好的解決方案是直接在模板中獲取,為此,我們使用的一個新技術自定義模板標簽來完成任務。注意要在使用任何下的模板標簽以前導入它。在頁面側邊欄使用自定義模板標簽追夢人物的博客的評論區留言。
我們的博客側邊欄有四項內容:最新文章、歸檔、分類和標簽云。這些內容相對比較固定,且在各個頁面都會顯示,如果像文章列表或者文章詳情一樣,從視圖函數中獲取然后傳遞給模板,則每個頁面對應的視圖函數里都要寫一段獲取這些內容的代碼,這會導致很多重復代碼。更好的解決方案是直接在模板中獲取,為此,我們使用 Django 的一個新技術:自定義模板標簽來完成任務。
使用模板標簽的解決思路我們前面已經接觸過一些 Django 內置的模板標簽,比如比較簡單的 {% static %} 模板標簽,這個標簽幫助我們在模板中引入靜態文件。還有比較復雜的如 {% for %} {% endfor%} 標簽。這里 我們希望自己定義一個模板標簽,例如名為 get_recent_posts 的模板標簽,它可以這樣工作:我們只要在模板中寫入 {% get_recent_posts as recent_post_list %},那么模板中就會有一個從數據庫獲取的最新文章列表,并通過 as 語句保存到 recent_post_list 模板變量里。這樣我們就可以通過 {% for %} {% endfor%} 模板標簽來循環這個變量,顯示最新文章列表了,這和我們在編寫博客首頁面視圖函數是類似的。首頁視圖函數中從數據庫獲取文章列表并保存到 post_list 變量,然后把這個 post_list 變量傳給模板,模板使用 for 模板標簽循環這個文章列表變量,從而展示一篇篇文章。這里唯一的不同是我們從數據庫獲取文章列表的操作不是在視圖函數中進行,而是在模板中通過自定義的 {% get_recent_posts %} 模板標簽進行。
以上就是解決思路,但模板標簽不是我們隨意寫的,必須遵循 Django 的規范我們才能在 Django 的模板系統中使用自定義的模板標簽,下面我們就依照這些規范來實現我們的需求。
模板標簽目錄結構首先在我們的 blog 應用下創建一個 templatetags 文件夾。然后在這個文件夾下創建一個 __init__.py 文件,使這個文件夾成為一個 Python 包,之后在 templatetags 目錄下創建一個 blog_tags.py 文件,這個文件存放自定義的模板標簽代碼。
此時你的目錄結構應該是這樣的:
blog __init__.py admin.py apps.py migrations __init__.py models.py static templatetags __init__.py blog_tags.py tests.py views.py編寫模板標簽代碼
接下來就是編寫各個模板標簽的代碼了,自定義模板標簽代碼寫在 blog_tags.py 文件中。其實模板標簽本質上就是一個 Python 函數,因此按照 Python 函數的思路來編寫模板標簽的代碼就可以了,并沒有任何新奇的東西或者需要新學習的知識在里面。
最新文章模板標簽打開 blog_tags.py 文件,開始寫我們的最新文章模板標簽。
blog/templatetags/blog_tags.py from ..models import Post def get_recent_posts(num=5): return Post.objects.all().order_by("-created_time")[:num]
這個函數的功能是獲取數據庫中前 num 篇文章,這里 num 默認為 5。函數就這么簡單,但目前它還只是一個純 Python 函數,Django 在模板中還不知道該如何使用它。為了能夠通過 {% get_recent_posts %} 的語法在模板中調用這個函數,必須按照 Django 的規定注冊這個函數為模板標簽,方法如下:
blog/templatetags/blog_tags.py from django import template from ..models import Post register = template.Library() @register.simple_tag def get_recent_posts(num=5): return Post.objects.all().order_by("-created_time")[:num]
這里我們首先導入 template 這個模塊,然后實例化了一個 template.Library 類,并將函數 get_recent_posts 裝飾為 register.simple_tag。這樣就可以在模板中使用語法 {% get_recent_posts %} 調用這個函數了。
注意 Django 1.9 后才支持 simple_tag 模板標簽,如果你使用的 Django 版本小于 1.9,你將得到一個錯誤。Django 1.9 以前的版本如何自定義模板標簽這里不再贅述。
歸檔模板標簽和最新文章模板標簽一樣,先寫好函數,然后將函數注冊為模板標簽即可。
blog/templatetags/blog_tags.py @register.simple_tag def archives(): return Post.objects.dates("created_time", "month", order="DESC")
這里 dates 方法會返回一個列表,列表中的元素為每一篇文章(Post)的創建時間,且是 Python 的 date 對象,精確到月份,降序排列。接受的三個參數值表明了這些含義,一個是 created_time ,即 Post 的創建時間,month 是精度,order="DESC" 表明降序排列(即離當前越近的時間越排在前面)。例如我們寫了 3 篇文章,分別發布于 2017 年 2 月 21 日、2017 年 3 月 25 日、2017 年 3 月 28 日,那么 dates 函數將返回 2017 年 3 月 和 2017 年 2 月這樣一個時間列表,且降序排列,從而幫助我們實現按月歸檔的目的。
分類模板標簽過程還是一樣,先寫好函數,然后將函數注冊為模板標簽。注意分類模板標簽函數中使用到了 Category 類,其定義在 blog.models.py 文件中,使用前記得先導入它,否則會報錯。
blog/templatetags/blog_tags.py from ..models import Post, Category @register.simple_tag def get_categories(): # 別忘了在頂部引入 Category 類 return Category.objects.all()
盡管側邊欄有 4 項內容(還有一個標簽云),但是這里我們只實現最新文章、歸檔和分類數據的顯示,還有一個標簽云沒有實現。因為標簽云的實現稍有一點不同,所以將在接下來的教程中專門介紹。這里你也可以嘗試著自己解決,如果遇到問題,可以通過官方文檔或者搜索引擎求助。獨立思考并尋求解決方案以及善用搜索引擎是一個開發者必須培養的能力,只有這樣你才能成為一個獨立的開發者,獨立地解決別人可能從來沒有遇到過的問題。
使用自定義的模板標簽打開 base.html,為了使用模板標簽,我們首先需要在模板中導入存放這些模板標簽的模塊,這里是 blog_tags.py 模塊。當時我們為了使用 static 模板標簽時曾經導入過 {% load staticfiles %},這次在 {% load staticfiles %} 下再導入 blog_tags:
templates/base.html {% load staticfiles %} {% load blog_tags %} ...
然后找到最新文章列表處,把里面的列表修改一下:
templates/base.html
這里我們通過使用 get_recent_posts 模板標簽獲取到最新文章列表,然后我們通過 as 語法(Django 模板系統的語法)將獲取的文章列表保存進了 recent_post_list 模板變量中,之后就可以通過 for 循環來循環顯示文章列表數據了,這和我們在寫首頁視圖時是一樣的。
然后是歸檔部分:
templates/base.html
同樣,這里我們調用 archives 模板標簽自動獲取一個已發表文章的日期列表,精確到月份,降序排列,然后通過 as 語法將其保存在 date_list 模板變量里。由于日期列表中的元素為 Python 的 date 對象,因此可以通過其 year 和 month 屬性分別獲取年和月的信息,{{ date.year }} 年 {{ date.month }} 月 反應了這個事實。
分類部分也一樣:
(13) 顯示的是該分類下的文章數目,這個特性會在接下來的教程中講解如何實現,目前暫時用占位數據代替吧。
現在運行開發服務器,可以看到側邊欄顯示的數據已經不再是之前的占位數據,而是我們保存在數據庫中的數據了。
注意:如果你按照教程的步驟做完后發現報錯,請按以下順序檢查。
檢查目錄結構是否正確。確保 templatetags 位于 blog 目錄下,且目錄名必須為 templatetags。具體請對照上文給出的目錄結構。
確保 templatetags 目錄下有 __init__.py 文件。
確保使用的 Django 版本不小于 1.9。
確保通過 register = template.Library() 和 @register.simple_tag 裝飾器將函數裝飾為一個模板標簽。
確保在使用模板標簽以前導入了 blog_tags,即 {% load blog_tags %}。注意要在使用任何 blog_tags 下的模板標簽以前導入它。
確保模板標簽的語法使用正確,即 {% load blog_tags %},注意 { 和 % 以及 % 和 } 之間沒有任何空格。
總結本章節的代碼位于:Step10: side bar。
如果遇到問題,請通過下面的方式尋求幫助。
在 頁面側邊欄:使用自定義模板標簽 - 追夢人物的博客 的評論區留言。
將問題的詳細描述通過郵件發送到 djangostudyteam@163.com,一般會在 24 小時內回復。
更多Django 教程,請訪問 追夢人物的博客。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44395.html
摘要:側邊欄已經正確地顯示了最新文章列表歸檔分類等信息。重啟一下開發服務器,再次測試,發現可以顯示歸檔下的文章列表了。在分類與歸檔追夢人物的博客的評論區留言。將問題的詳細描述通過郵件發送到,一般會在小時內回復。 側邊欄已經正確地顯示了最新文章列表、歸檔、分類等信息。現在來完善歸檔和分類功能,當用戶點擊歸檔下的某個日期或者分類下的某個分類時,跳轉到文章列表頁面,顯示該日期或者分類下的全部文章。...
摘要:本章集中介紹四個重要的小功能回到頂部浮動按鈕矢量圖標頁腳沉底和粘性側邊欄。因為我們想在全站都擁有這個按鈕,所以將剛寫好的模塊引用到中在后面引入注意模塊用到了,因此要在后面引入。 本章集中介紹四個重要的小功能:回到頂部浮動按鈕、矢量圖標、頁腳沉底和粘性側邊欄。 這幾個功能與Django基本沒啥關系,更多的是前端知識,但是對博客網站都很重要,問的讀者也比較多,因此也集中講一下好了。 回到頂...
摘要:對文章詳情視圖而言,每篇文章對應著不同的。在博客文章詳情頁追夢人物的博客的評論區留言。將問題的詳細描述通過郵件發送到,一般會在小時內回復。更多教程,請訪問追夢人物的博客。 首頁展示的是所有文章的列表,當用戶看到感興趣的文章時,他點擊文章的標題或者繼續閱讀的按鈕,應該跳轉到文章的詳情頁面來閱讀文章的詳細內容。現在讓我們來開發博客的詳情頁面,有了前面的基礎,開發流程都是一樣的了:首先配置 ...
摘要:我選擇的是萬網,阿里下面的。然后在主題配置文件下添加主題配置文件中添加自定義樣式不得不說還是很人性化的,你可以個性化定制你的網站,你所有的改動需要放在主題文件的文件中,會 前言 本篇文章是在已經搭建好gitpage+hexo的博客的前提下(不懂怎么搭建的可以參考我的另一篇博文:了解githubPages+hexo搭建博客的原理 或者利用Gitpage+hexo開發自己的博客,這兩篇博文...
摘要:我選擇的是萬網,阿里下面的。然后在主題配置文件下添加主題配置文件中添加自定義樣式不得不說還是很人性化的,你可以個性化定制你的網站,你所有的改動需要放在主題文件的文件中,會 前言 本篇文章是在已經搭建好gitpage+hexo的博客的前提下(不懂怎么搭建的可以參考我的另一篇博文:了解githubPages+hexo搭建博客的原理 或者利用Gitpage+hexo開發自己的博客,這兩篇博文...
閱讀 1079·2021-11-16 11:44
閱讀 1368·2019-08-30 13:12
閱讀 2401·2019-08-29 16:05
閱讀 3070·2019-08-28 18:29
閱讀 904·2019-08-26 13:41
閱讀 3228·2019-08-26 13:34
閱讀 2596·2019-08-26 10:35
閱讀 931·2019-08-26 10:28