在模型中指定排序
為了讓文章(Post)按釋出時間逆序排列,即最新發表的文章排在文章列表的最前面,我們對返回的文章列表進行了排序,即各個檢視函式中都有類似於 Post.objects.all().order_by('-created_time')
這樣的程式碼,這導致了很多重複。因為只要是返回的文章列表,基本都是逆序排列的,因此我們可以在 Post 模型中指定 Post 的自然排序方式。
Django 允許我們在 models.Model 的子類裡定義一個 Meta 的內部類,這個內部類通過指定一些屬性來規定這個類該有的一些特性,例如在這裡我們要指定 Post 的排序方式。首先看到 Post 的程式碼:
blog/models.py
@python_2_unicode_compatible
class Post(models.Model):
...
created_time = models.DateTimeField()
...
def __str__(self):
...
def get_absolute_url(self):
...
現在在 Post 類的內部定義一個 Meta 類,並指定排序屬性:
blog/models.py
@python_2_unicode_compatible
class Post(models.Model):
...
created_time = models.DateTimeField()
...
def __str__(self):
...
def get_absolute_url(self):
...
class Meta:
ordering = ['-created_time']
ordering
屬性用來指定文章排序方式,['-created_time']
指定了依據哪個屬性的值進行排序,這裡指定為按照文章釋出時間排序,且負號表示逆序排列。列表中可以用多個項,比如 ordering = ['-created_time', 'title']
,那麼首先依據 created_time
排序,如果 created_time
相同,則再依據 title
排序。這樣指定以後所有返回的文章列表都會自動按照 Meta 中指定的順序排序,因此可以刪掉檢視函式中對文章列表中返回結果進行排序的程式碼了。
完善跳轉連結
導航欄有一個 Black & White 的 Logo,我們希望點選它就能回到首頁面,只修修改一下超連結即可。開啟 base.html,修改 Logo 處的超連結:
<header id="site-header">
<div class="row">
<div class="logo">
- <h1><a href="index.html"><b>Black</b> & White</a></h1>
+ <h1><a href="{% url 'blog:index' %}"><b>Black</b> & White</a></h1>
</div>
...
</div>
</header>
另外導航欄還有一個首頁導航按鈕,也希望點選它就能回到首頁面,修改的任務作為練習交給你了。
當然還有一些跳轉可以完善,比如文章標題下有分類、釋出時間、作者、評論量、閱讀量等資訊,可以設定點選分類跳轉到分類頁面;點選評論量就跳轉到文章詳情頁的評論處等,這些細節部分不涉及新知識,就當做練習交給你自己完成了。
顯示正確的評論量
有兩處地方顯示的評論量,顯示評論量的方法很簡單。回顧一下我們是如何獲取某篇 post
的下的評論列表的?我們使用的是 post.comment_set.all()
。all
方法返回該 post
關聯的評論列表。此外模型管理器(comment_set
是一個特殊的模型管理器)還有一個 count
方法,返回的是數量,即 post
下有多少條評論,我們可以直接在模板中呼叫這個方法:{{ post.comment_set.count }}。將評論量替換成該模板變數就可以正確顯示文章的評論數了。
結束了麼
我們通過一個部落格實戰專案,瞭解了 Django 基本的開發技術。包括如何編寫模型(Model)、如何編寫檢視函式(View)、如何使用 Django 內建的模板系統(Template)以及如何配置路由(URL),這四大模組是 Django 開發的核心所在,現在我們已經能夠基本掌握這些模組的使用方法了。
但是,還沒完...
Django 提供的不僅僅是這些,我們的部落格也不僅僅只有這些功能。如何實現標籤雲效果?如何給部落格提供 RSS 訂閱服務?如果實現文章搜尋?如果網站需要提供使用者系統,如何實現使用者的註冊登入?如何部署到伺服器上讓他人通過公網訪問?這些需求都可以利用 Django 提供的 API 來實現。
另外,Django 還有海量的第三方應用來提供更加豐富的功能。比如當他人評論了我的文章時,如何收到通知提醒?網站需要提供新浪微博、微信等社交賬號的登入等等,這些都可以藉助 Django 第三方應用快速完成,而我們自己只需要寫很少量的程式碼就可以了。
所以,讓我們再接再厲,進入到 Django 部落格開發進階教程,學習更多的 Django 開發技巧,為部落格提供更多的功能吧!
總結
本章節的程式碼位於:Step13: fix some issues。
如果遇到問題,請通過下面的方式尋求幫助。
在 已知小問題修正- 追夢人物的部落格 的評論區留言。
將問題的詳細描述通過郵件傳送到 djangostudyteam@163.com,一般會在 24 小時內回覆。
更多Django 教程,請訪問 追夢人物的部落格。