本教程內(nèi)容已過時(shí)陨献,更新版教程請?jiān)L問: Django 博客開發(fā)入門教程。
文章按發(fā)布時(shí)間逆序排列
有的朋友已經(jīng)注意到了,目前文章列表的顯示順序是按照發(fā)布時(shí)間順序排列的慕趴,最新發(fā)布的文章排在最后,這不符合習(xí)慣鄙陡。正確的排列方式應(yīng)該是按發(fā)布時(shí)間逆序排列冕房,即最新發(fā)表的文章應(yīng)該顯示在最前面。要實(shí)現(xiàn)這種排列方式有兩種方法趁矾。
首先看到我們的首頁視圖函數(shù):
blog/views.py
def index(request):
post_list = Post.objects.all()
return render(request, 'blog/index.html', context={'post_list': post_list})
首頁視圖函數(shù)的功能是從數(shù)據(jù)庫獲取到全部文章的列表耙册,然后渲染首頁模板以顯示這些文章數(shù)據(jù)。我們通過 Post.objects.all()
獲取到全部文章數(shù)據(jù)毫捣,這個方法返回一個類似于列表一樣的數(shù)據(jù)結(jié)構(gòu)详拙。通過調(diào)用 order_by
方法可以對其進(jìn)行排序帝际,即把首頁視圖函數(shù)的代碼改成:
blog/views.py
def index(request):
post_list = Post.objects.all().order_by('-created_time')
return render(request, 'blog/index.html', context={'post_list': post_list})
我們根據(jù) Post 的 created_time 屬性的值進(jìn)行排序,前面的負(fù)號表示逆序排列饶辙,不加負(fù)號則是正常的正序排列蹲诀。
這是首頁的文章列表的,另外我們還有某一分類下的文章列表弃揽,以及歸檔下的文章列表脯爪。同理我們可以在相應(yīng)的視圖函數(shù)里把獲取到的文章列表按照上述方式排序即可。但我們也會發(fā)現(xiàn)每個地方都要加上這么一個排序方法顯得很麻煩矿微。因此我們介紹第二種排序方式痕慢,使用 Post 的 Meta 屬性。
django 允許我們在 models.Model 的子類里定義一個 Meta 的內(nèi)部類涌矢,這個內(nèi)部類通過指定一些屬性來規(guī)定這個類本該有的一些特性掖举,例如在這里我們要指定 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):
...
現(xiàn)在在 Post 類的內(nèi)部定義一個 Meta 類娜庇,并指定排序?qū)傩裕?/p>
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']
指定了依據(jù)哪個屬性的值進(jìn)行排序,這里指定了文章發(fā)布時(shí)間思灌,且負(fù)號表示逆序排列俺叭。這里列表中可以用多個項(xiàng),比如 ordering = ['-created_time', 'title']
泰偿,那么首先會依據(jù) created_time 排序熄守,如果 created_time 的值相同,則再依據(jù) title 排序耗跛。
此后所有返回的文章列表都會自動按照 Meta 中指定的順序排序了裕照。
一些腳本文件忘了修改 static 標(biāo)簽
我們前面通過 {% static %} 標(biāo)簽來引入 css 和 js 文件,但是前面的教程漏掉了一些 js 文件的引入调塌,導(dǎo)致點(diǎn)擊導(dǎo)航欄處的搜索按鈕無效晋南,這里修復(fù)一下。打開 base.html 文件羔砾,修改文件最底部處的一個 js 文件引用:
base.html
...
<body>
...
- <script src="js/script.js"></script>
+ <script src="{% static 'blog/js/script.js' %}"></script>
</body>
完善一些跳轉(zhuǎn)鏈接
導(dǎo)航欄有一個 Black & White 的 Logo负间,我們希望點(diǎn)擊它就能回到首頁面,只修修改一下超鏈接即可姜凄。打開 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>
另外導(dǎo)航欄還有一個 Home 導(dǎo)航按鈕,也希望點(diǎn)擊它就能回到首頁面态秧,修改的任務(wù)作為練習(xí)交給你了董虱。
結(jié)束語
感謝大家的支持,django 博客開發(fā)入門教程在這里就全部結(jié)束了。
但是愤诱,還沒完...
通過大家的反饋云头,教程暴露了很多的問題,這是我個人水平問題造成的淫半。我會根據(jù)大家的反饋持續(xù)修正教程的內(nèi)容溃槐,使其更加完善,盡可能地為后來的學(xué)習(xí)者掃除學(xué)習(xí)障礙撮慨。
另外竿痰,由于本教程定位為面向零基礎(chǔ)的 django 入門開發(fā)者,所以涉及的內(nèi)容有限砌溺,博客實(shí)現(xiàn)的功能也很單一。像如何部署博客到服務(wù)器变隔、實(shí)現(xiàn)博客文章列表分頁规伐、全文搜索、標(biāo)簽等都沒有涉及匣缘。關(guān)于這方面的內(nèi)容我會寫到另一專題中猖闪,并發(fā)布到我的個人博客:追夢人物的博客。本博客也會持續(xù)更新和 django 開發(fā)有關(guān)的其它話題肌厨,如果你要進(jìn)一步學(xué)習(xí) django 開發(fā)的話培慌,請關(guān)注我的個人博客。
和其它 django 開發(fā)者交流也是學(xué)好 django 的重要途徑柑爸,這里匯集了大量經(jīng)驗(yàn)豐富的 django 開發(fā)者吵护,他們能在你學(xué)習(xí) django 時(shí)為你提供有價(jià)值的幫助,期待你的加入表鳍。
django 學(xué)習(xí)小組 QQ 群:561422498
django 學(xué)習(xí)交流論壇:Python 中文社
django 學(xué)習(xí)小組郵件列表:django_study@groups.163.com
django 博客:追夢人物的博客