14. 已知小問題修正

本教程內(nèi)容已過時(shí),更新版教程請(qǐng)?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ù),這個(gè)方法返回一個(gè)類似于列表一樣的數(shù)據(jù)結(jié)構(gòu)。通過調(diào)用 order_by 方法可以對(duì)其進(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ù)號(hào)表示逆序排列,不加負(fù)號(hào)則是正常的正序排列。

這是首頁的文章列表的,另外我們還有某一分類下的文章列表,以及歸檔下的文章列表。同理我們可以在相應(yīng)的視圖函數(shù)里把獲取到的文章列表按照上述方式排序即可。但我們也會(huì)發(fā)現(xiàn)每個(gè)地方都要加上這么一個(gè)排序方法顯得很麻煩。因此我們介紹第二種排序方式,使用 Post 的 Meta 屬性。

django 允許我們?cè)?models.Model 的子類里定義一個(gè) Meta 的內(nèi)部類,這個(gè)內(nèi)部類通過指定一些屬性來規(guī)定這個(gè)類本該有的一些特性,例如在這里我們要指定 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)部定義一個(gè) 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ù)哪個(gè)屬性的值進(jìn)行排序,這里指定了文章發(fā)布時(shí)間,且負(fù)號(hào)表示逆序排列。這里列表中可以用多個(gè)項(xiàng),比如 ordering = ['-created_time', 'title'] ,那么首先會(huì)依據(jù) created_time 排序,如果 created_time 的值相同,則再依據(jù) title 排序。

此后所有返回的文章列表都會(huì)自動(dòng)按照 Meta 中指定的順序排序了。

一些腳本文件忘了修改 static 標(biāo)簽

我們前面通過 {% static %} 標(biāo)簽來引入 css 和 js 文件,但是前面的教程漏掉了一些 js 文件的引入,導(dǎo)致點(diǎn)擊導(dǎo)航欄處的搜索按鈕無效,這里修復(fù)一下。打開 base.html 文件,修改文件最底部處的一個(gè) js 文件引用:

base.html

...
<body>
...
- <script src="js/script.js"></script>
+ <script src="{% static 'blog/js/script.js' %}"></script>
</body>

完善一些跳轉(zhuǎn)鏈接

導(dǎo)航欄有一個(gè) 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)航欄還有一個(gè) Home 導(dǎo)航按鈕,也希望點(diǎn)擊它就能回到首頁面,修改的任務(wù)作為練習(xí)交給你了。

結(jié)束語

感謝大家的支持,django 博客開發(fā)入門教程在這里就全部結(jié)束了。

但是,還沒完...

通過大家的反饋,教程暴露了很多的問題,這是我個(gè)人水平問題造成的。我會(huì)根據(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)容我會(huì)寫到另一專題中,并發(fā)布到我的個(gè)人博客:追夢(mèng)人物的博客。本博客也會(huì)持續(xù)更新和 django 開發(fā)有關(guān)的其它話題,如果你要進(jìn)一步學(xué)習(xí) django 開發(fā)的話,請(qǐng)關(guān)注我的個(gè)人博客。

和其它 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 博客:追夢(mèng)人物的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容