摘要:而文章分類一個(gè)重要的途徑就是設(shè)置欄目。修改文件欄目的欄目標(biāo)題創(chuàng)建時(shí)間文章欄目的一對(duì)多外鍵欄目的有兩個(gè)字段,名稱和創(chuàng)建日期。修改文章的欄目功能,也就完成了。對(duì)個(gè)人博客來說,欄目數(shù)據(jù)的變動(dòng)通常是很少的。
博客的文章類型通常不止一種:有時(shí)候你會(huì)寫高深莫測(cè)的技術(shù)文章,有時(shí)候又純粹只記錄一下當(dāng)天的心情。
因此對(duì)文章的分類就顯得相當(dāng)?shù)闹匾?,既方便博主?duì)文章進(jìn)行分類歸檔,也方便用戶有針對(duì)性的閱讀。
而文章分類一個(gè)重要的途徑就是設(shè)置欄目。
欄目的模型實(shí)現(xiàn)文章欄目功能的方法有多種。你可以只是簡(jiǎn)單的在文章的Model中增加CharField()字段,以字符串的形式將欄目名稱保存起來(實(shí)際上這種實(shí)現(xiàn)更像是“標(biāo)簽”,以后會(huì)講到)。這樣做的優(yōu)點(diǎn)是比較簡(jiǎn)單;缺點(diǎn)也很明顯,就是時(shí)間長(zhǎng)了你可能會(huì)記混欄目的名字,并且也不方便對(duì)欄目的其他屬性進(jìn)行擴(kuò)展。
因此對(duì)文章欄目可以獨(dú)立為一個(gè)Model,用外鍵與文章的Model關(guān)聯(lián)起來。
修改article/modles.py文件:
article/models.py ... class ArticleColumn(models.Model): """ 欄目的 Model """ # 欄目標(biāo)題 title = models.CharField(max_length=100, blank=True) # 創(chuàng)建時(shí)間 created = models.DateTimeField(default=timezone.now) def __str__(self): return self.title class ArticlePost(models.Model): ... # 文章欄目的 “一對(duì)多” 外鍵 column = models.ForeignKey( ArticleColumn, null=True, blank=True, on_delete=models.CASCADE, related_name="article" ) ...
欄目的Model有兩個(gè)字段,“名稱”和“創(chuàng)建日期”。
一篇文章只有一個(gè)欄目,而一個(gè)欄目可以對(duì)應(yīng)多篇文章,因此建立“一對(duì)多”的關(guān)系。
寫好模型后記得用makemigrations和migrate指令遷移數(shù)據(jù)。
列表中顯示欄目 添加測(cè)試數(shù)據(jù)模型寫好之后就需要幾條欄目的數(shù)據(jù)來進(jìn)行測(cè)試。由于還沒有寫視圖,因此需要善加利用Django自帶的后臺(tái)。
首先把欄目模型注冊(cè)到后臺(tái):
article/admin.py ... from .models import ArticleColumn # 注冊(cè)文章欄目 admin.site.register(ArticleColumn)
然后就可以在后臺(tái)中添加欄目的數(shù)據(jù)條目了:
先隨便添加了“HTML”、“Java”、“Django”這3條。
在后臺(tái)中隨便打開一篇文章,“欄目”字段已經(jīng)靜靜的在等你了:
隨機(jī)找?guī)灼恼略O(shè)置不同的欄目用于測(cè)試。
重寫文章列表之前我們用卡片類型的UI界面展示文章列表。
卡片的好處是簡(jiǎn)潔大方,但是隨著數(shù)據(jù)的增多,卡片小小的版面已經(jīng)不堪重負(fù)了。
因此這里重寫list.html模板的列表循環(huán):
article/list.html ...{% for article in articles %}...{% if article.column %} {% endif %}{% endfor %}{{ article.title }}
{{ article.body|slice:"100" }}...
{{ article.total_views }} 瀏覽 {{ article.created|date:"Y-m-d" }} 發(fā)布 {{ article.updated|date:"Y-m-d" }} 更新
最主要的改動(dòng)就是新增了展現(xiàn)“欄目”的按鈕。我們甚至還為不同的欄目設(shè)置了不同的按鈕顏色。
在附加信息中順便還把之前沒有用到的日期信息也添加上去了。
來看看效果:
感覺還不錯(cuò)!
修改寫文章功能展示已經(jīng)沒問題了,但是發(fā)表新文章時(shí)還不能選擇欄目。
修改寫文章的模板,在表單中新增下面的內(nèi)容:
templates/article/create.html ...
是表單的下拉框選擇組件。在這個(gè)組件中循環(huán)列出所有的欄目數(shù)據(jù),并且設(shè)置value屬性,指定表單提交欄目的id值。
刷新頁面,效果像下面這樣:
跟之前一樣,能夠展示了,但是還沒有處理表單的視圖邏輯。
修改已有的寫文章視圖article_create(),讓其能夠處理表單上傳的欄目數(shù)據(jù):
article/views.py # 引入欄目Model from .models import ArticleColumn ... # 寫文章的視圖 ... def article_create(request): if request.method == "POST": ... if article_post_form.is_valid(): ... # 新增的代碼 if request.POST["column"] != "none": new_article.column = ArticleColumn.objects.get(id=request.POST["column"]) # 已有代碼 new_article.save() ... else: ... # 新增及修改的代碼 columns = ArticleColumn.objects.all() context = { "article_post_form": article_post_form, "columns": columns } ...
新增代碼涉及get和post兩部分:
POST:主要考慮某些文章是可以沒有欄目的。因此用if語句判斷該文章是否有欄目,如果有,則根據(jù)表單提交的value值,關(guān)聯(lián)對(duì)應(yīng)的欄目。
GET:增加欄目的上下文,以便模板使用。
測(cè)試一下,寫文章的欄目功能應(yīng)該可以正常工作了。
修改更新視圖更新文章的視圖同樣也需要升級(jí)一下。
還是先更改模板:
templates/article/update.html ......
與前面稍有不同的是,表單中判斷了column.id與article.column.id是否相等,如果相等則將其設(shè)置為默認(rèn)值。
然后修改視圖函數(shù):
article/views.py # 更新文章 ... def article_update(request, id): ... # 判斷用戶是否為 POST 提交表單數(shù)據(jù) if request.method == "POST": ... if article_post_form.is_valid(): ... # 新增的代碼 if request.POST["column"] != "none": article.column = ArticleColumn.objects.get(id=request.POST["column"]) else: article.column = None ... else: ... # 新增及修改的代碼 columns = ArticleColumn.objects.all() context = { "article": article, "article_post_form": article_post_form, "columns": columns, } ...
代碼邏輯與前面很類似。修改文章的欄目功能,也就完成了。
總結(jié)本章實(shí)現(xiàn)了簡(jiǎn)單的欄目功能,可以舒舒服服對(duì)文章進(jìn)行分類了,強(qiáng)迫癥福音啊。
還有些可以完善的工作,比如:
單擊欄目按鈕顯示所有相同欄目的文章。這個(gè)功能與之前學(xué)過的最熱文章排序以及搜索文章非常的類似。還記得filter()方法嗎?
欄目Model的增刪改查。
對(duì)個(gè)人博客來說,欄目數(shù)據(jù)的變動(dòng)通常是很少的。如果你不想寫增刪改查,用后臺(tái)修改數(shù)據(jù)是完全可以的。
以上內(nèi)容就不再贅述了。留給讀者去嘗試實(shí)現(xiàn)。
有疑問請(qǐng)?jiān)诙刨惖膫€(gè)人網(wǎng)站留言,我會(huì)盡快回復(fù)。
或Email私信我:[email protected]
項(xiàng)目完整代碼:Django_blog_tutorial
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43103.html
摘要:每一篇文章的標(biāo)簽可能都不一樣,并且還可能擁有多個(gè)標(biāo)簽,這是與欄目功能不同的。列表中顯示標(biāo)簽雖然保存標(biāo)簽的功能已經(jīng)實(shí)現(xiàn)了,還得把它顯示出來才行。更多的用法請(qǐng)閱讀官方文檔總結(jié)本章學(xué)習(xí)了使用來完成標(biāo)簽功能。 標(biāo)簽是作者從文章中提取的核心詞匯,其他用戶可以通過標(biāo)簽快速了解文章的關(guān)注點(diǎn)。每一篇文章的標(biāo)簽可能都不一樣,并且還可能擁有多個(gè)標(biāo)簽,這是與欄目功能不同的。 好在標(biāo)簽功能也有優(yōu)秀的三方庫(kù):D...
摘要:教程看到這里,你已經(jīng)學(xué)會(huì)如下內(nèi)容搭建開發(fā)環(huán)境博文管理用戶管理發(fā)表評(píng)論若干小功能搭建簡(jiǎn)單的小博客,以上的功能夠用了。教程為了起步平緩,沒有展開這方面的內(nèi)容。陌生人,祝你學(xué)業(yè)進(jìn)步事業(yè)有成歡迎常到杜賽的個(gè)人網(wǎng)站做客 教程看到這里,你已經(jīng)學(xué)會(huì)如下內(nèi)容: 搭建開發(fā)環(huán)境 博文管理 用戶管理 發(fā)表評(píng)論 若干小功能 搭建簡(jiǎn)單的小博客,以上的功能夠用了。 相信你的志向不止于此。畢竟程序員面試個(gè)個(gè)造火...
摘要:比較流行的解決方案是允許用戶通過第三方登錄,即可以通過微博這類知名社區(qū)的授權(quán),從而登錄你的小站,免去了注冊(cè)的麻煩。微博微信的登錄方式大致都遵循這個(gè)流程本章雖然加載了微博的接口,但是限于篇幅并沒有配置,請(qǐng)讀者查閱官方文檔去實(shí)現(xiàn)。 現(xiàn)在我們已經(jīng)擁有一個(gè)可以進(jìn)行用戶本地登錄的博客系統(tǒng)了。如果有人欣賞你的文章,說不定就會(huì)注冊(cè)成為本地用戶,并和你好好交流一番。 但頭疼的是,用戶可能每天都在互聯(lián)網(wǎng)...
摘要:語法支持再次打開文件,在文件的最后添加指明了使用語法標(biāo)記,做了兩個(gè)拓展,其中表示支持語法高亮,包含的特性請(qǐng)參見相關(guān)文檔。語法高亮支持注意這一步必須在安裝完主題之后。 目前網(wǎng)上搭建個(gè)人博客的方案很多,雖然使用諸如 Wordpress ( PHP )、Hexo ( Node.js ) 等可以方便快速地搭建一款功能齊全的高性能個(gè)人博客,但是本文將嘗試一種更為小眾化的方案 —— 一款基于 dj...
摘要:隨著時(shí)間的推移加上勤奮的寫作,你的博客文章一定會(huì)越來越多。如果不進(jìn)行處理,可能同一個(gè)頁面會(huì)擠上成百上千的文章,不美觀不說,還降低了頁面的反應(yīng)速度。這個(gè)時(shí)候就需要對(duì)文章進(jìn)行分頁的處理。有疑問請(qǐng)?jiān)诙刨惖膫€(gè)人網(wǎng)站留言,我會(huì)盡快回復(fù)。 隨著時(shí)間的推移(加上勤奮的寫作?。愕牟┛臀恼乱欢〞?huì)越來越多。如果不進(jìn)行處理,可能同一個(gè)頁面會(huì)擠上成百上千的文章,不美觀不說,還降低了頁面的反應(yīng)速度。 這個(gè)時(shí)...
閱讀 2728·2023-04-25 17:21
閱讀 2585·2021-11-23 09:51
閱讀 2882·2021-09-24 10:32
閱讀 3807·2021-09-23 11:33
閱讀 2000·2019-08-30 15:44
閱讀 3478·2019-08-30 11:18
閱讀 3577·2019-08-30 10:53
閱讀 651·2019-08-26 13:25