Django 博客開發教程 13 - 已知小問題修正
在模型中指定排序
為了讓文章(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 >
<div >
<div >
- <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 教程,請訪問 追夢人物的博客 和 Python 中文社區。
最後更新:2017-06-01 21:02:19