作者:HelloGitHub-追夢人物
文中涉及的示例代碼,已同步更新到 HelloGitHub-Team 倉庫
<https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial>
在之前的系列教程中,我們已經(jīng)實現(xiàn)了:文章的發(fā)布、展示、評論等功能,可能認(rèn)真的小伙伴已經(jīng)發(fā)現(xiàn)這些功能有一些地方設(shè)計的不是很好,今天我們就來優(yōu)化一些體驗和操作上的細(xì)節(jié)。讓我們的博客更加完美,使用起來更加順手~
在模型中指定排序
為了讓文章(Post)按發(fā)布時間逆序排列,讓最新發(fā)表的文章排在文章列表的最前面,我們對返回的文章列表進(jìn)行了排序,即各個視圖函數(shù)中都有類似于
Post.objects.all().order_by('-created_time')
這樣的代碼,導(dǎo)致了很多重復(fù)。因為只要是返回的文章列表,基本都是逆序排列的,所以可以在 Post 模型中指定 Post 的自然排序方式。
django 允許我們在 models.Model 的子類里定義一個名為 Meta
的內(nèi)部類,通過這個內(nèi)部類指定一些屬性的值來規(guī)定這個模型類該有的一些特性,例如在這里我們要指定 Post 的排序方式。首先看到 Post 的代碼,在Post
模型的內(nèi)部定義的Meta 類中,指定排序?qū)傩?ordering:
blog/models.py class Post(models.Model): ... created_time =
models.DateTimeField() ... class Meta: verbose_name = '文章' verbose_name_plural
= verbose_name ordering = ['-created_time']
ordering 屬性用來指定文章排序方式,['-created_time']
指定了依據(jù)哪個屬性的值進(jìn)行排序,這里指定為按照文章發(fā)布時間排序,且負(fù)號表示逆序排列。列表中可以有多個項,比如ordering =
['-created_time', 'title'] 表示首先依據(jù) created_time 排序,如果 created_time 相同,則再依據(jù) title
排序。這樣指定以后所有返回的文章列表都會自動按照Meta 中指定的順序排序,因此可以刪掉視圖函數(shù)中對文章列表中返回結(jié)果進(jìn)行排序的代碼了。
評論的模型類(Comment)也可以添加這個屬性。
完善跳轉(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="{%
url 'blog:index' %}"><b>Black</b> & White</a></h1> </div> ... </div>
</header>
另外導(dǎo)航欄還有一個首頁導(dǎo)航按鈕,也希望點(diǎn)擊它就能回到首頁面,修改的任務(wù)作為練習(xí)交給你了(有兩處,一處是桌面端導(dǎo)航,另一處是移動端導(dǎo)航)。
當(dāng)然還有一些跳轉(zhuǎn)可以完善,比如文章標(biāo)題下有分類、發(fā)布時間、作者、評論量、閱讀量等信息,可以設(shè)置點(diǎn)擊分類跳轉(zhuǎn)到分類頁面;點(diǎn)擊閱讀量就跳轉(zhuǎn)到文章詳情頁等,這些細(xì)節(jié)部分不涉及新知識,就當(dāng)做練習(xí)交給你自己完成了。
顯示正確的評論量
有兩處地方顯示的評論量(首頁文章列表和文章詳情頁),顯示評論量的方法很簡單?;仡櫼幌挛覀兪侨绾潍@取某篇文章下的評論列表的?我們使用的是
post.comment_set.all()。all 方法返回該 post 關(guān)聯(lián)的評論列表。此外模型管理器(comment_set
是一個特殊的模型管理器)還有一個count 方法,返回的是數(shù)量,即 post 下有多少條評論,我們可以直接在模板中調(diào)用這個方法:{{
post.comment_set.count }}。將評論量替換成該模板變量就可以正確顯示文章的評論數(shù)了。
跳轉(zhuǎn)評論區(qū)域
有時候文章內(nèi)容長了,評論列表的內(nèi)容就需要滾動很長的頁面才能看到。我們可以在評論區(qū)域增加一個錨點(diǎn),2
處顯示評論量的地方超鏈接都指向這個錨點(diǎn)處,這樣點(diǎn)擊這兩個地方將直接跳轉(zhuǎn)到評論列表區(qū)域,方便用戶快速查看評論內(nèi)容。
看到顯示評論的模板代碼:
<section class="comment-area" id="comment-area"> <hr> <h3>發(fā)表評論</h3> ...
</section>
我們已經(jīng)給評論區(qū)域的標(biāo)簽設(shè)置了 id,只需要在評論的鏈接后加上這個 id 的錨點(diǎn)即可:
blog/index.html <div class="entry-meta"> ... <span class="comments-link"><a
href="{{ post.get_absolute_url }}#comment-area">{{ post.comment_set.count }}
評論</a></span> <span class="views-count"><a href="#">588 閱讀</a></span> </div>
blog/detail.html <header class="entry-header"> <h1 class="entry-title">{{
post.title }}</h1> ... <span class="comments-link"><a href="#comment-area">{{
post.comment_set.count }} 評論</a></span> <span class="views-count"><a
href="#">588 閱讀</a></span> </div> </header>
注意這里從 index.html 到評論區(qū)域需要跳轉(zhuǎn)頁面,因此 href 超鏈接指定為絕對 URL,而文章詳情和評論區(qū)域在一個頁面,因此僅需指定錨點(diǎn)即可。
結(jié)束了么
我們通過一個博客實戰(zhàn)項目,了解了 django 基本的開發(fā)技術(shù)。包括如何編寫模型(Model)、如何編寫視圖函數(shù)(View)、如何使用 django
內(nèi)置的模板系統(tǒng)(Template)以及如何配置路由(URL),這四大模塊是 django 開發(fā)的核心所在,現(xiàn)在我們已經(jīng)能夠基本掌握這些模塊的使用方法了。
但是,還沒完...
Django 提供的不僅僅是這些,我們的博客也不僅僅只有這些功能。如何對博客文章進(jìn)行分頁?如何給博客提供 RSS
訂閱服務(wù)?如果實現(xiàn)文章搜索?如果網(wǎng)站需要提供用戶系統(tǒng),如何實現(xiàn)用戶的注冊登錄?如何部署到服務(wù)器上讓他人通過公網(wǎng)訪問?這些需求都可以利用 django
內(nèi)置的模塊或者豐富的第三方應(yīng)用來實現(xiàn)。
另外,django
還有海量的第三方應(yīng)用來提供更加豐富的功能。比如當(dāng)他人評論了我的文章時,如何收到通知提醒?網(wǎng)站需要提供新浪微博、微信等社交賬號的登錄等等,這些都可以借助
django 第三方應(yīng)用快速完成,而我們自己只需要寫很少量的代碼就可以了。
所以,讓我們再接再厲,進(jìn)入到進(jìn)階篇,繼續(xù)學(xué)習(xí)更多的 django 開發(fā)技巧,為博客提供更多的功能吧!
『講解開源項目系列』
——讓對開源項目感興趣的人不再畏懼、讓開源項目的發(fā)起者不再孤單。跟著我們的文章,你會發(fā)現(xiàn)編程的樂趣、使用和發(fā)現(xiàn)參與開源項目如此簡單。歡迎留言聯(lián)系我們、加入我們,讓更多人愛上開源、貢獻(xiàn)開源~
熱門工具 換一換