摘要:每一篇文章的標(biāo)簽可能都不一樣,并且還可能擁有多個標(biāo)簽,這是與欄目功能不同的。列表中顯示標(biāo)簽雖然保存標(biāo)簽的功能已經(jīng)實現(xiàn)了,還得把它顯示出來才行。更多的用法請閱讀官方文檔總結(jié)本章學(xué)習(xí)了使用來完成標(biāo)簽功能。
“標(biāo)簽”是作者從文章中提取的核心詞匯,其他用戶可以通過標(biāo)簽快速了解文章的關(guān)注點。每一篇文章的標(biāo)簽可能都不一樣,并且還可能擁有多個標(biāo)簽,這是與欄目功能不同的。
好在標(biāo)簽功能也有優(yōu)秀的三方庫:Django-taggit,省得自己動手設(shè)計了。快速開發(fā)就是這樣,能“借用”就不要自己重復(fù)勞動。
安裝及設(shè)置首先在虛擬環(huán)境中安裝Django-taggit:
pip install django-taggit
安裝成功后,修改項目設(shè)置以添加庫:
my_blog/settings.py ... INSTALLED_APPS = [ ... "taggit", ] ...修改文章模型
標(biāo)簽是文章Model的屬性,因此需要修改文章模型。
需要注意的是標(biāo)簽引用的不是內(nèi)置字段,而是庫中的TaggableManager,它是處理多對多關(guān)系的管理器:
article/models.py ... # Django-taggit from taggit.managers import TaggableManager ... class ArticlePost(models.Model): ... # 文章標(biāo)簽 tags = TaggableManager(blank=True) ...
然后記得數(shù)據(jù)遷移。
帶標(biāo)簽文章的發(fā)表修改文章的表單類,讓其能夠提交標(biāo)簽字段:
article/forms.py ... class ArticlePostForm(forms.ModelForm): class Meta: ... fields = ("title", "body", "tags")
然后修改發(fā)表文章的視圖,保存POST中的標(biāo)簽:
article/views.py ... def article_create(request): # 已有代碼 if request.method == "POST": article_post_form = ArticlePostForm(data=request.POST) if article_post_form.is_valid(): new_article = article_post_form.save(commit=False) ... new_article.save() # 新增代碼,保存 tags 的多對多關(guān)系 article_post_form.save_m2m() ...
需要注意的是,如果提交的表單使用了commit=False選項,則必須調(diào)用save_m2m()才能正確的保存標(biāo)簽,就像普通的多對多關(guān)系一樣。
最后就是在發(fā)表文章的模板中添加標(biāo)簽的表單項了:
templates/article/create.html ......
運行服務(wù)器,就可以在發(fā)表頁面看到效果了:
多個標(biāo)簽最好用英文逗號進(jìn)行分隔。中文逗號有的版本會報錯,干脆就不要去使用了。
列表中顯示標(biāo)簽雖然保存標(biāo)簽的功能已經(jīng)實現(xiàn)了,還得把它顯示出來才行。
顯示標(biāo)簽最常用的位置是在文章列表中,方便用戶篩選感興趣的文章。
修改文章列表的模板,將標(biāo)簽顯示出來:
templates/article/list.html
...
...
{% for tag in article.tags.all %}
{{ tag }}
{% endfor %}
...
鏈接中的class中是Bootstrap定義的徽章樣式。
插入位置緊靠在欄目按鈕的后面。當(dāng)然你想放到其他位置也是完全可以的。
刷新列表頁面看看效果:
標(biāo)簽過濾有時候用戶想搜索帶有某一個標(biāo)簽的所有文章,現(xiàn)在就來做這個功能。
與搜索功能一樣,只需要調(diào)取數(shù)據(jù)時用filter()方法過濾結(jié)果就可以了。
修改標(biāo)簽中的href,使其帶有tag參數(shù)返回到View中:
templates/article/list.html
...
{% for tag in article.tags.all %}
{{ tag }}
{% endfor %}
...
然后在View中取得tag的值,并進(jìn)行搜索。
下面的代碼將article_list()函數(shù)完整寫出來了(包括上一章末尾沒講的欄目查詢),方便讀者比對。
article/views.py ... def article_list(request): # 從 url 中提取查詢參數(shù) search = request.GET.get("search") order = request.GET.get("order") column = request.GET.get("column") tag = request.GET.get("tag") # 初始化查詢集 article_list = ArticlePost.objects.all() # 搜索查詢集 if search: article_list = article_list.filter( Q(title__icontains=search) | Q(body__icontains=search) ) else: search = "" # 欄目查詢集 if column is not None and column.isdigit(): article_list = article_list.filter(column=column) # 標(biāo)簽查詢集 if tag and tag != "None": article_list = article_list.filter(tags__name__in=[tag]) # 查詢集排序 if order == "total_views": article_list = article_list.order_by("-total_views") paginator = Paginator(article_list, 3) page = request.GET.get("page") articles = paginator.get_page(page) # 需要傳遞給模板(templates)的對象 context = { "articles": articles, "order": order, "search": search, "column": column, "tag": tag, } return render(request, "article/list.html", context) ...
注意Django-taggit中標(biāo)簽過濾的寫法:filter(tags__name__in=[tag]),意思是在tags字段中過濾name為tag的數(shù)據(jù)條目。賦值的字符串tag用方括號包起來。
之所以這樣寫是因為Django-taggit還支持多標(biāo)簽的聯(lián)合查詢,比如:Model.objects.filter(tags__name__in=["tag1", "tag2"])
為了實現(xiàn)帶參數(shù)的交叉查詢,還要將翻頁等位置的href修改一下:
templates/article/list.html ... 最新 ... 最熱 ... « 1 ...
標(biāo)簽過濾功能就完成了。
Django-taggit更多的用法請閱讀官方文檔:Django-taggit
總結(jié)本章學(xué)習(xí)了使用Django-taggit來完成標(biāo)簽功能。
在學(xué)習(xí)階段,你可以不借助他人的輪子,自己實現(xiàn)功能:瞎折騰對掌握基礎(chǔ)有很大幫助。
實際開發(fā)時,又分為兩種情況:
淺層需求某項通用功能,開發(fā)完成后改動不大:此類功能建議盡量使用輪子,加快開發(fā)效率。人生苦短,能節(jié)約的時間,一秒鐘都不要浪費。
需要大量定制化的功能,開發(fā)完成后需要頻繁改動:此類功能因為經(jīng)常對底層代碼進(jìn)行改動,與其在別人的代碼上修修補(bǔ)補(bǔ),還不如自己從頭寫了。自己的代碼不僅熟悉,而且都是為定制化而生的。
到底如何選擇,就根據(jù)你的喜歡進(jìn)行斟酌了。
有疑問請在杜賽的個人網(wǎng)站留言,我會盡快回復(fù)。
或Email私信我:dusaiphoto@foxmail.com
項目完整代碼:Django_blog_tutorial
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/43162.html
摘要:教程看到這里,你已經(jīng)學(xué)會如下內(nèi)容搭建開發(fā)環(huán)境博文管理用戶管理發(fā)表評論若干小功能搭建簡單的小博客,以上的功能夠用了。教程為了起步平緩,沒有展開這方面的內(nèi)容。陌生人,祝你學(xué)業(yè)進(jìn)步事業(yè)有成歡迎常到杜賽的個人網(wǎng)站做客 教程看到這里,你已經(jīng)學(xué)會如下內(nèi)容: 搭建開發(fā)環(huán)境 博文管理 用戶管理 發(fā)表評論 若干小功能 搭建簡單的小博客,以上的功能夠用了。 相信你的志向不止于此。畢竟程序員面試個個造火...
摘要:后面兩個編輯器自帶,不用單獨下載,添上就可以了添加相關(guān)插件這樣就完成了代碼高亮效果不錯在前臺使用為了讓用戶在前臺也能使用富文本編輯器,還得對代碼稍加改動。對于有些不喜歡的人來說,甚至可以連博文都使用提供的富文本編輯器。 前面我們已經(jīng)實現(xiàn)了用Markdown語法寫文章了。但是文章的評論用Markdown就不太合適了,你不能強(qiáng)求用戶也花時間去熟悉語法啊。另外評論中通常還有表情、帶顏色的字體...
摘要:語法支持再次打開文件,在文件的最后添加指明了使用語法標(biāo)記,做了兩個拓展,其中表示支持語法高亮,包含的特性請參見相關(guān)文檔。語法高亮支持注意這一步必須在安裝完主題之后。 目前網(wǎng)上搭建個人博客的方案很多,雖然使用諸如 Wordpress ( PHP )、Hexo ( Node.js ) 等可以方便快速地搭建一款功能齊全的高性能個人博客,但是本文將嘗試一種更為小眾化的方案 —— 一款基于 dj...
摘要:接下來你就可以在項目的任何地方發(fā)送通知了像這樣其中的參數(shù)釋義發(fā)送通知的對象接收通知的對象動詞短語鏈接到動作的對象可選執(zhí)行通知的對象可選有點繞,舉個栗子杜賽在搭建個人博客中對你發(fā)表了評論。有疑問請在杜賽的個人網(wǎng)站留言,我會盡快回復(fù)。 憑借你勤奮的寫作,拜讀你文章的用戶越來越多,他們的評論也分散在眾多的文章之中。作為博主,讀者的留言肯定是要都看的;而讀者給你留言,自然也希望得到回復(fù)。 怎么...
摘要:一些表單界面元素文本框或復(fù)選框非常簡單并內(nèi)置在中,而其他會復(fù)雜些像彈出日期選擇等操作控件。和標(biāo)簽中的屬性指定了當(dāng)前文本框提交的數(shù)據(jù)的名稱,它必須與表單類中的字段名稱對應(yīng),否則服務(wù)器無法將字段和數(shù)據(jù)正確的對應(yīng)起來。 前面我們已經(jīng)學(xué)會如何用Markdown語法書寫文章了。 但是還有問題呀。之前寫文章都是在后臺中進(jìn)行的,萬一有別的普通用戶也要發(fā)表文章怎么辦?萬一我想拓展些后臺中沒有的提交驗證...
閱讀 2470·2023-04-25 21:41
閱讀 1647·2021-09-22 15:17
閱讀 1921·2021-09-22 10:02
閱讀 2433·2021-09-10 11:21
閱讀 2569·2019-08-30 15:53
閱讀 996·2019-08-30 15:44
閱讀 946·2019-08-30 13:46
閱讀 1125·2019-08-29 18:36