閱讀575 返回首頁    go 微軟 go windows


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> &amp; White</a></h1>
        + <h1><a href="{% url 'blog:index' %}"><b>Black</b> &amp; 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

如果遇到問題,請通過下麵的方式尋求幫助。

更多Django 教程,請訪問 追夢人物的博客Python 中文社區

最後更新:2017-06-01 21:02:19

  上一篇:go  Django 博客開發教程 14 - 使用 Nginx 和 Gunicorn 部署 Django 博客
  下一篇:go  Django 博客開發教程 12 - 評論