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