1. 程式人生 > >Django學習筆記三:頁面側邊欄最新文章,文章歸檔,分類,標籤雲的實現

Django學習筆記三:頁面側邊欄最新文章,文章歸檔,分類,標籤雲的實現

前言

執行效果

這裡寫圖片描述
(箭頭 == 點選)

根據效果圖可以知道我們要實現的功能:將內容填充到各個側邊欄對應的內容下面,並實現對應的跳轉功能。
下面我們一項一項的實現下列的功能:
首先在blog應用下建立一個templatetags資料夾,資料夾下面建立一個init.py,宣告資料夾為python包,同時建立blog_tags.py資料夾,存放自定義的模板標籤。

最新文章

思路:首先要獲取資料庫中的前三篇文章,然後在模板index.html和detail.html中呼叫顯示。現在我們要解兩個問題。獲取和呼叫顯示。

獲取

使用Article.objects.all()從資料庫獲取全部資料獲得一個列表,在使用切片提取前三篇文章。

templatetags/blog_tags.py
def get_recent_article(num=3):
    return Article.objects.all().order_by('-created_time')[:num]

呼叫顯示在模板

使用Django內建的模板標籤:我們寫入 {% get_recent_article as recent_post_list %}將從函式中獲取的文章列表儲存通過as儲存在recent_post_list模板變數中,最後呼叫{% for %}{% endfor %}模板標籤迴圈變數。
為了呼叫獲取函式,先註冊函式為模板標籤:

templatetags/blog_tags.py

from django import template #匯入template模組
register = template.Library()
#例項化template.Library()類

@register.simple_tag
#將函式裝飾為register.simple_tag
def get_recent_article(num=3):
    return Article.objects.all().order_by('-created_time')[:num]

修改detail.html和index.html模板:

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

現在開啟瀏覽器輸入本地伺服器就可以看到我們的文章以及新增到最新文章下面啦,同時點選文章標題就可以檢視文章的詳情。

文章歸檔

思路和最新文章類似,只不過我們從資料庫裡面獲取的是文章是每篇文章的時間,點選文章歸檔的時間跳轉到某個時間下的所有文章。

獲取時間部分

templatetags/blog_tags.py
@register.simple_tag
def archives():
    #month是精度,精確到月
    return Article.objects.dates('created_time','month',order='DESC')

獲取某個時間下的所有文章

使用filter方法根據條件過濾。

blog/views.py
def archives(request, year, month):
    #注意created_time__year後面是兩個下劃線
    article_list = Article.objects.filter(created_time__year=year,created_time__month=month).order_by('-created_time')
    return render(request, 'index.html', context={'article_list':article_list})

繫結檢視和url

blog/urls.py
   url(r'^archives/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$',views.archives, name='archives'),

修改detail.html和index.html模板

templates/*.detail
<div class="widget widget-archives">
                      <h3 class="widget-title">文章歸檔</h3>
                      {% archives as date_list %}
                      <ul>
                        {% for date in date_list %}
                          <li>
                              <a href="{% url 'blog:archives' date.year date.month %}">{{ date.year }}年 {{ date.month }}月</a>
                          </li>
                          {% empty %}
                          暫無歸檔!
                          {% endfor %}
                      </ul>
                  </div>

分類

分類和文章歸檔類似。不同的一點是我們要統計分類下面的文章數量,此時可以使用django模型的annotate方法。前面我們從資料庫取資料都是用的模型管理器objects實現的,比如獲取全部分類是:

Category.objects.all()

獲取一個名為test的分類,獲取方法:

Category.objects.get(name='test')

模型管理器objects除了all,get方法之外,還有一個annotate方法,可以幫助我們實現統計分類下的文章數量的功能。

獲取分類部分(包含統計數量)

templatetags/blog_tags.py
@register.simple_tag
def get_categories():
#統計數量   Category_list=Category.objects.annotate(num_article = Count('article'))
    return Category_list

獲取某個分類下的所有文章

使用filter方法根據條件過濾。

blog/views.py
def category(request,id):
    cate = get_object_or_404(Category,id=id)
    article_list = Article.objects.filter(category=cate).order_by('-created_time')

    return render(request, 'index.html', context={'article_list':article_list})

繫結檢視和url

blog/urls.py
   url(r'^category/(?P<id>[0-9]+)/$',views.category, name='category'),,

修改detail.html和index.html模板

templates/*.detail
  <div class="widget widget-category">
                      <h3 class="widget-title">分類</h3>
                      {% get_categories as category_list %}
                      <ul>
                        {% for category in category_list %}
                          <li>
                           <a href="{% url 'blog:category' category.id %}">{{ category.name }}({{ category.num_article}})</span></a>
                          </li>
                          {% empty %}
                          暫無歸檔!
                          {% endfor %}
                      </ul>
                  </div>

到現在頁面側邊欄的三項功能啦。

標籤雲

標籤雲功能和分類思路和做法完全一樣,就不詳述啦。

總結

頁面側邊欄的實現主要用到了Django模板標籤,模板管理器object裡面的get,all,和獲取每個分類下面的文章從統計量annotate方法。
學到這裡忽然發現我前面沒用模板繼承是多麼麻煩。以至於每次改模板都要修改兩個,強烈建議使用模板繼承。

相關推薦

Django學習筆記頁面最新文章文章歸檔分類,標籤實現

前言 執行效果 (箭頭 == 點選) 根據效果圖可以知道我們要實現的功能:將內容填充到各個側邊欄對應的內容下面,並實現對應的跳轉功能。 下面我們一項一項的實現下列的功能: 首先在blog應用下建立一個templatetags資料夾,資料夾下

Linux學習筆記()系統執行級與執行級的切換

查看 用戶操作 回車 water hat ntsysv tde 文件表 config 1.Linux系統與其它的操作系統不同,它設有執行級別。該執行級指定操作系統所處的狀態。Linux系統在不論什麽時候都執行於某個執行級上,且在不同的執行級上執行的程序和服務都不同,所要

MYSQL學習筆記日期和時間函數

div content minute name top fonts table hmm 指定 MYSQL學習筆記三:日期和時間函數 1. 獲取當前日期的函數和獲取當前時間的函數 /*獲取當前日期的函數和獲取當前時間的函數。將日期以‘YYYY-MM-DD‘或者’YYYYM

Odoo10學習筆記模型(結構化的應用數據)、視圖(用戶界面設計)

其他 描述 用戶界面 列表 支持 字段 界面設計 允許 學習 一:模型 1:創建模型 模型屬性:模型類可以使用一些屬性來控制它們的一些行為: _name :創建odoo模型的內部標識符,必含項。 _description :當用戶界面顯示模型時,一個方便用戶的模型記錄標題。

tensorflow學習筆記()實現自編碼器

sea start ear var logs cos soft 編碼 red 黃文堅的tensorflow實戰一書中的第四章,講述了tensorflow實現多層感知機。Hiton早年提出過自編碼器的非監督學習算法,書中的代碼給出了一個隱藏層的神經網絡,本人擴展到了多層,改進

CSS學習筆記自定義單選框復選框開關

sla checked 移動 transform 第一個 16px 位移 block back 一點一點學習CCS,這次學習了如何自定義單選框,復選框以及開關。 一、單選框 1、先寫好body裏面的樣式,先寫幾個框 1 <body> 2 <d

Android學習筆記用Intent串聯activity

conda data activity setresult result 意圖 prot 其他 cte 一:Intent Intent可以理解為 意圖。 我們可以通過創建intent實例來定義一個跳轉意圖,意圖包括:要跳轉到哪個頁面、需要傳遞什麽

vue學習筆記()vue-cli腳手架搭建

node log ins 版本 返回 ges 技術分享 安裝webpack webp 一:安裝vue-cli腳手架: 1:為了確保你的node版本在4.*以上,輸入 node -v 查看本機node版本,低於4請更新。 2:輸入: npm install -g vue-c

小程序學習筆記頁面文件詳解之 .json文件

fresh 小程序 整體 屬性 spa hit rbac style mdi 頁面配置文件—— pageName.json 每一個小程序頁面可以使用.json文件來對本頁面的窗口表現進行配置,頁面中配置項會覆蓋 app.json 的 window 中相同的配置

MYSQL進階學習筆記MySQL流程控制語句!(視頻序號進階_7-10)

sls @age 分享 流程 null set oop 默認 soft 知識點四:MySQL流程控制語句(7-10) 選擇語句:   (IF ELSE ELSE IF CASE 分支)IFNULL函數 IF語法: 語法規則:

Docker學習筆記Docker鏡像image

nta process space ffffff 筆記 地址 running build mark Docker的C/S模式的運行 一:查看鏡像#docker images REPOSITORY TAG IMAGE ID

Django學習django-admin 和 項目manage.py程序

目的 lec pac mpi reat 全局 manage 變量 use 目錄 Django django-admin 和 項目manage.py程序 它倆是什麽? 命令程序用法 常用命令 Django django-admin 和 項目manage.py程序 它倆是

ROS學習筆記()自定義話題的程式設計

前言:ros給我們提供了眾多的訊息結構,但是更多時候我們需要根據自己的研發需求定義自己的訊息結構。 一、檢視ros自帶的訊息結構 我們最常用的一個訊息結構就是std_msgs,那麼怎麼檢視這個訊息結構支援可以定義哪些資料型別呢? 我們使用roscd std_msgs/這個命令開啟該訊息結

Linux學習筆記Linux常用命令

1.目錄處理命令ls ls -a顯示所有檔案,包括隱藏檔案     -l詳細資訊顯示 -lh以人性化方式顯示             列出來的資料的顯示形式:許可權 別調用次數 檔案所

分散式學習筆記分散式系統session一致性的問題

session的概念 什麼是session? 伺服器為每個使用者建立一個會話,儲存使用者的相關資訊,以便多次請求能夠定位到同一個上下文。這樣,當用戶在應用程式的 Web 頁之間跳轉時,儲存在 Session 物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。當用戶請求來自應用程式的

JavaScript 學習筆記輸出輸入語句

文章目錄 一、輸出語句 二、輸入語句 三、示例: 一、輸出語句 JavaScript 沒有任何列印或者輸出函式。可以通過以下方式來顯示資料: 1.使用 windows.alert() 彈出警告框,可省略windows,直接使用 aler

csdn學習筆記meta元表、元方法 __index, __newindex、rawset、rawget

重要:在表和元表的__index 和 __newindex 都沒有需要操作的key時,賦值table操作會呼叫__newindex, 取值操作會呼叫__index    元表設定setmetatable t1 = {}; t2 = {}; print("t1=",

python爬蟲學習筆記圖片爬取

圖片爬取的程式碼 r.content 檔案的二進位制格式 Python引入了with語句來自動幫我們呼叫close()方法: open(path, ‘-模式-‘,encoding=’UTF-8’)  w:以寫方式開啟, a:以追加模式開啟 (從 EOF 開始, 必要時建

mapreduce學習筆記平均值

求平均數是MapReduce比較常見的演算法,求平均數的演算法也比較簡單,一種思路是Map端讀取資料,在資料輸入到Reduce之前先經過shuffle,將map函式輸出的key值相同的所有的value值形成一個集合value-list,然後將輸入到Reduce端,Reduce端彙總並且統計記錄數,然後作商即可

Esper學習筆記EPL語法(1)

1.EPL語法簡介 EPL全稱Event Processing Language,是一種類似SQL的語言,包含了SELECT, FROM, WHERE, GROUP BY, HAVING 和 ORDER BY子句,同時用事件流代替了table作為資料來源,並且能像SQL那樣join,fil