Diango博客--8.解鎖博客側欄

文章目錄

    • 0.思路引導
    • 1.[最新文章] 模板標簽
    • 2.[歸檔] 模板標簽
    • 3.[分類] 模板標簽
    • 4.[標簽云] 模板標簽
    • 5.使用自定義的模板標簽

0.思路引導

博客側邊欄有四項內容:最新文章、歸檔、分類和標簽云,效果展示如下:
在這里插入圖片描述

這些內容相對比較固定和獨立,且在各個頁面都會顯示,如果像文章列表或者文章詳情一樣,從視圖函數中獲取這些數據然后傳遞給模板,則每個頁面對應的視圖函數里都要寫一段獲取這些內容的代碼,這會導致很多重復代碼。

更好的解決方案是直接在模板中獲取,為此,我們使用 django 的一個新技術:自定義模板標簽來完成任務。

我們前面已經接觸過一些 django 內置的模板標簽,比如比較簡單的 {% static %} 模板標簽,這個標簽幫助我們在模板中引入靜態文件。還有比較復雜的如 {% for %} {% endfor%} 標簽。

這里我們希望自己定義一個模板標簽,例如名為 show_recent_posts 的模板標簽,它可以這樣工作:我們只要在模板中寫入 {% show_recent_posts %},那么模板中就會渲染一個最新文章列表頁面,這和我們在編寫博客首頁面視圖函數是類似的。

首頁視圖函數中從數據庫獲取文章列表并保存到 post_list 變量,然后把這個 post_list 變量傳給模板,模板使用 for 模板標簽循環這個文章列表變量,從而展示一篇篇文章。

這里唯一的不同是我們從數據庫獲取文章列表的操作不是在視圖函數中進行,而是在模板中通過自定義的 {% show_recent_posts %} 模板標簽進行。

1.[最新文章] 模板標簽

首先在 blog 應用下創建一個 templatetags 文件夾。然后在這個文件夾下創建一個 init.py 文件,使這個文件夾成為一個 Python 包,之后在 templatetags\ 目錄下創建一個 blog_extras.py 文件,這個文件存放自定義的模板標簽代碼。
文件位置:blog/templatetags/blog_extras.py

from django import templatefrom ..models import Post, Category, Tagregister = template.Library()@register.inclusion_tag('blog/inclusions/_recent_posts.html', takes_context=True)
def show_recent_posts(context, num=5):return {'recent_post_list': Post.objects.all().order_by('-created_time')[:num],}

這里我們首先導入 template 這個模塊,然后實例化了一個 template.Library 類,并將函數 show_recent_posts 裝飾為 register.inclusion_tag,這樣就告訴 django,這個函數是我們自定義的一個類型為 inclusion_tag 的模板標簽。

inclusion_tag 模板標簽和視圖函數的功能類似,它返回一個字典值,字典中的值將作為模板變量,傳入由 inclusion_tag 裝飾器第一個參數指定的模板blog/inclusions/_recent_posts.html。

當我們在模板中(base.html)通過 {% show_recent_posts %}使用自己定義的模板標簽時,django 會將指定模板的內容使用模板標簽 {% show_recent_posts %}返回的模板變量渲染后替換。

接下來就是定義模板 _recent_posts.html 的內容。在 templates\blogs 目錄下創建一個 inclusions 文件夾,然后創建一個 _recent_posts.html 文件,內容如下:

文件位置:templates\blogs\inclusions _recent_posts.html

<div class="widget widget-recent-posts"><h3 class="widget-title">最新文章</h3><ul>{% for post in recent_post_list %}<li><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></li>{% empty %}暫無文章!{% endfor %}</ul>
</div>

循環由{% show_recent_posts %}傳遞的模板變量 recent_post_list 即可,和 index.html 中循環顯示文章列表是一樣的。

2.[歸檔] 模板標簽

和上一部分類似,接下來對其余部分代碼進行補充。

文件位置:blog/templatetags/blog_extras.py

@register.inclusion_tag('blog/inclusions/_archives.html', takes_context=True)
def show_archives(context):return {'date_list': Post.objects.dates('created_time', 'month', order='DESC'),}

文件位置:templates\blogs\inclusions _archives.html

<div class="widget widget-archives"><h3 class="widget-title">歸檔</h3><ul>{% for date in date_list %}<li><a href="#">{{ date.year }}{{ date.month }}</a></li>{% empty %}暫無歸檔!{% endfor %}</ul>
</div>

3.[分類] 模板標簽

文件位置:blog/templatetags/blog_extras.py

@register.inclusion_tag('blog/inclusions/_categories.html', takes_context=True)
def show_categories(context):return {'category_list': Category.objects.all(),}

文件位置:templates\blogs\inclusions _categories.html

<div class="widget widget-category"><h3 class="widget-title">分類</h3><ul>{% for category in category_list %}<li><a href="#">{{ category.name }} <span class="post-count">(13)</span></a></li>{% empty %}暫無分類!{% endfor %}</ul>
</div>

4.[標簽云] 模板標簽

文件位置:blog/templatetags/blog_extras.py

@register.inclusion_tag('blog/inclusions/_tags.html', takes_context=True)
def show_tags(context):return {'tag_list': Tag.objects.all(),}

文件位置:templates\blogs\inclusions _tags.html

<div class="widget widget-tag-cloud"><h3 class="widget-title">標簽云</h3><ul>{% for tag in tag_list %}<li><a href="#">{{ tag.name }}</a></li>{% empty %}暫無標簽!{% endfor %}</ul>
</div>

5.使用自定義的模板標簽

打開 base.html,為了使用剛才定義的模板標簽,我們首先需要在模板中導入存放這些模板標簽的模塊,這里是 blog_extras.py 模塊。當時我們為了使用 static 模板標簽時曾經導入過 {% load static %},這次在 {% load static %} 下再導入 blog_extras:

文件位置:templates/base.html


{% load static %}
{% load blog_extras %}
<!DOCTYPE html>
<html>
...
</html>

然后找到側邊欄各項,將他們都替換成對應的模板標簽:

文件位置:templates/base.html


<aside class="col-md-4">{% block toc %}{% endblock toc %}{% show_recent_posts %}{% show_archives %}{% show_categories %}{% show_tags %}<div class="rss"><a href=""><span class="ion-social-rss-outline"></span> RSS 訂閱</a></div>
</aside>

此前側邊欄中各個功能塊都替換成了模板標簽,其實實際內容還是一樣的,只是我們將其挪到了模塊化的模板中,并有這些自定義的模板標簽負責渲染這些內容。

此外我們定義的 show_recent_posts 標簽可以接收參數,默認為 5,即顯示 5 篇文章,如果要控制其顯示 10 篇文章,可以使用 {% show_recent_posts 10 %} 這種方式傳入參數。

現在運行開發服務器,可以看到側邊欄顯示的數據已經不再是之前的占位數據,而是我們保存在數據庫中的數據了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452494.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452494.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452494.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

十五、詳述 IntelliJ IDEA 插件的安裝及使用方法

正文 首先&#xff0c;進入插件安裝界面&#xff1a; Mac&#xff1a;IntelliJ IDEA -> Preferences -> Plugins;Windows&#xff1a;File -> Settings -> Plugins.標注 1&#xff1a;顯示 IntelliJ IDEA 的插件分類&#xff0c; All plugins&#xff1a;顯示 Inte…

編程巨星的唯一秘訣

別以為是那些軟件開發定律&#xff0c;別以為是開發出那些特殊用途的軟件&#xff0c;別以為是軟件設計技術本身。只有一條真理決定了一個軟件程序員的成功還是失敗。由于堅持這個真理&#xff0c;一個資深的程序員能在一天的時間里學會一門新的編程語言&#xff0c;而由于不堅…

面向數據流的設計方法

面向數據流的設計方法的目標是給出設計軟件結構的一個系統化的途徑。 在軟件工程的需求分析階段&#xff0c;信息流是一個關鍵考慮。通常用數據流圖描繪信息在系統中加工和流動的 情況。面向數據流的設計方法定義了一些不同的“映射”&#xff0c;利用這些映射可以把數據流圖…

AI研究的盲點:無解的神經網絡內在邏輯

論人工神經網絡內在邏輯的研究歷史及現狀。 伴隨著大數據&#xff0c;人工智能&#xff08;AI&#xff09;在沉寂了多年之后&#xff0c;又迎來了新的高潮。在這場涉及大部分科學的革命中&#xff0c;人工神經網絡釋放了人工智能&#xff08;AI&#xff09;。但科學家們發現&a…

Diango博客--9.歸檔、分類和標簽頁

文章目錄0.思路引導1.回顧2.歸檔頁面3.分類頁面4.標簽頁面0.思路引導 側邊欄已經正確地顯示了最新文章列表、歸檔、分類、標簽等信息&#xff0c;現在來完善歸檔、分類和標簽功能。 當用戶點擊歸檔下的某個日期、分類欄目下的某個分類或者標簽欄目下的某個標簽時&#xff0c;…

android studio1.2.6,1.2.2 使用Android Studio開發Android APP | 菜鳥教程

寫在前面本節將介紹如何使用Android Studio開發Android APP&#xff0c;和前面Eclipse ADT SDK搭建Android開發環境一樣&#xff0c;本節也只是介紹一些基本東西&#xff0c;深入的&#xff0c;比如快捷鍵&#xff0c;小技巧等會再另一篇文章中詳細地介紹&#xff01;1.下載A…

軟件工程中的啟發規則

1.改進軟件結構提高模塊獨立性 2. 模塊規模應該適中 3.深度、寬度、扇出和扇入都應適當 4.模塊的作用域應該在控制域之內 5.力爭降低模塊接口的復雜程度 6.設計單入口單出口的模塊 7.模塊功能應該可以預測

C#指南,重溫基礎,展望遠方!(4)表達式

表達式是在操作數和運算符的基礎之上構造而成。 表達式的運算符指明了向操作數應用的運算。 運算符的示例包括 、-、*、/ 和 new。 操作數的示例包括文本、字段、局部變量和表達式。 如果表達式包含多個運算符&#xff0c;那么運算符的優先級決定了各個運算符的計算順序。 例如…

UPS開始嘗試“貨車+無人機”的投遞方式,不必再擔心快遞員離職了

繼亞馬遜“空中倉庫”&#xff0c;無人機送貨再現新形式。 作為世界上最大的快遞承運商與包裹遞送公司&#xff0c;UPS當然也沒有放過“送貨無人機”這一新穎業務。與亞馬遜推出“空中倉庫”的理念類似&#xff0c;UPS并沒有選擇讓無人機從倉庫直接起飛&#xff0c;而是將之與…

技術人員如何"正確"的浪費時間?

蘋果產品用戶要浪費時間&#xff0c;你就應該這樣做&#xff1a;買個有鎖的 iPhone &#xff0c;每天刷幾百次威鋒網等待越獄或解鎖&#xff0c;看到新 App 就安裝&#xff0c;程序提示更新立刻升級&#xff1b;有新的固件(哪怕是 β 版)就壓制不住升級的欲望&#xff1b;每次 …

Diango博客--10.交流的橋梁“評論功能”

文章目錄0.思路引導1.創建"評論"應用2.設計"評論"的數據庫模型3.注冊"評論"模型到 admin4.設計“評論”表單5.展示評論表單6.“評論”視圖函數7.綁定 URL8.向讀者發送是否“評論”成功的狀態9.詳情頁底部顯示“評論”內容0.思路引導 本文將創建…

python與android交互,Android客戶端與Python服務器端的簡單通信

最近在做一個APP&#xff0c;需要與服務器通信&#xff0c;一點一點的嘗試&#xff0c;記錄一下。本文使用了OkHttp和Flask框架。Android客戶端&#xff1a;實現功能輸入完點擊OK按鈕后會toast成功的信息。Python服務端&#xff1a;各部分代碼如下&#xff1a;activity_main.xm…

結構程序設計

結構程序設計經典定義&#xff1a;如果一個程序的代碼塊僅僅通過順序、選擇和循環這3種基本控制結構進行連接&#xff0c;并且每個代碼塊只有一個入口和一個出口&#xff0c;則稱這個程序是結構化的。 結構程序設計更全面的定義&#xff1a;結構程序設計是盡可能少用GO TO語句…

Sql Server 開窗函數Over()的使用

利用over()&#xff0c;將統計信息計算出來&#xff0c;然后直接篩選結果集1 declare t table(2 ProductID int,3 ProductName varchar(20),4 ProductType varchar(20),5 Price int)6 7 insert t8 select 1,name1,P1,3 union all9 select 2,name2,P1,5 union all 10 select 3,…

云棲科技評論第48期:前沿科技對世界的改造 我們這代人只完成了1%

1、數字經濟版圖呈中美雙分趨勢 日本IT行業為前景擔憂 數字經濟版圖呈中美雙分趨勢 日本IT行業為前景擔憂 【新聞摘要】《日本經濟新聞》日前刊文稱&#xff0c;數字經濟的勢力版圖呈現中國和美國兩強雙分的趨勢明顯&#xff0c;這意味著日本可能不得不使用中美的技術&#xff…

程序員犯的非技術錯誤(Top 5)

對于程序開發者來說&#xff0c;有兩種技術需要我們掌握&#xff0c;一個是技術上的能力&#xff0c;另一個是非技術上的能力。不幸的是&#xff0c;許多程序員過多地關注了技術上的能力&#xff0c;而忽略了非技術上的能力的培養&#xff0c;因此&#xff0c;我們的程序員們經…

CentOS下添加Root權限用戶‘超級用戶’方法(xxx is not in the sudoers file.This incident will be reported.的解決方法)

文章目錄1.添加普通用戶2.添加sudo文件的寫權限3.編輯sudoers文件4.撤銷sudoers文件寫權限1.添加普通用戶 [rootserver ~]# useradd fxd //添加一個名為fxd的用戶 [rootserver ~]# passwd fxd //修改密碼 Changing password for user chenjiafa. New UNIX password: //在這里輸…

android打印intent flag,Android flag詳解

Android flag詳解Android flag詳解一.Flag標志位在閱讀源碼的時候經常發現有一些標志屬性使用一些位操作來判斷是否具有該標志&#xff0c;增加標志或者去除標志。如&#xff1a;二.addFlags (int flags)和setFlags (int flags)區別Public Intent addFlags (int flags)增加額外…

人機界面設計

1.系統響應時間 系統響應時間指從用戶完成某個控制動作(例如&#xff0c;按回車鍵或單擊鼠標)&#xff0c;到軟件給出預期的響應(輸出信息或做動作)之間的這段時間。 系統響應時間有兩個重要屬性&#xff0c;分別是長度和易變性。 1&#xff09;長度&#xff1a;時間過長&#…

GeoHash資料

geohash基本原理 轉載于:https://www.cnblogs.com/hyl8218/p/9111410.html