国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Django搭建個人博客:文章標簽功能

Amio / 2359人閱讀

摘要:每一篇文章的標簽可能都不一樣,并且還可能擁有多個標簽,這是與欄目功能不同的。列表中顯示標簽雖然保存標簽的功能已經實現了,還得把它顯示出來才行。更多的用法請閱讀官方文檔總結本章學習了使用來完成標簽功能。

“標簽”是作者從文章中提取的核心詞匯,其他用戶可以通過標簽快速了解文章的關注點。每一篇文章的標簽可能都不一樣,并且還可能擁有多個標簽,這是與欄目功能不同的。

好在標簽功能也有優秀的三方庫:Django-taggit,省得自己動手設計了。快速開發就是這樣,能“借用”就不要自己重復勞動。

安裝及設置

首先在虛擬環境中安裝Django-taggit:

pip install django-taggit

安裝成功后,修改項目設置以添加庫:

my_blog/settings.py

...
INSTALLED_APPS = [
    ...
    "taggit",
]
...
修改文章模型

標簽是文章Model的屬性,因此需要修改文章模型。

需要注意的是標簽引用的不是內置字段,而是庫中的TaggableManager,它是處理多對多關系的管理器:

article/models.py

...

# Django-taggit
from taggit.managers import TaggableManager

...
class ArticlePost(models.Model):
    ...

    # 文章標簽
    tags = TaggableManager(blank=True)

    ...

然后記得數據遷移

帶標簽文章的發表

修改文章的表單類,讓其能夠提交標簽字段:

article/forms.py

...
class ArticlePostForm(forms.ModelForm):
    class Meta:
        ...
        fields = ("title", "body", "tags")

然后修改發表文章的視圖,保存POST中的標簽:

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 的多對多關系
            article_post_form.save_m2m()
            
            ...

需要注意的是,如果提交的表單使用了commit=False選項,則必須調用save_m2m()才能正確的保存標簽,就像普通的多對多關系一樣。

最后就是在發表文章的模板中添加標簽的表單項了:

templates/article/create.html

...

...
...
...

運行服務器,就可以在發表頁面看到效果了:

多個標簽最好用英文逗號進行分隔。中文逗號有的版本會報錯,干脆就不要去使用了。

列表中顯示標簽

雖然保存標簽的功能已經實現了,還得把它顯示出來才行。

顯示標簽最常用的位置是在文章列表中,方便用戶篩選感興趣的文章。

修改文章列表的模板,將標簽顯示出來:

templates/article/list.html

...

...



    {% for tag in article.tags.all %}
        
            {{ tag }}
        
    {% endfor %}


...

鏈接中的class中是Bootstrap定義的徽章樣式。

插入位置緊靠在欄目按鈕的后面。當然你想放到其他位置也是完全可以的。

刷新列表頁面看看效果:

標簽過濾

有時候用戶想搜索帶有某一個標簽的所有文章,現在就來做這個功能。

與搜索功能一樣,只需要調取數據時用filter()方法過濾結果就可以了。

修改標簽中的href,使其帶有tag參數返回到View中:

templates/article/list.html

...



    {% for tag in article.tags.all %}
        
            {{ tag }}
        
    {% endfor %}


...

然后在View中取得tag的值,并進行搜索。

下面的代碼將article_list()函數完整寫出來了(包括上一章末尾沒講的欄目查詢),方便讀者比對。

article/views.py

...
def article_list(request):
    # 從 url 中提取查詢參數
    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)

    # 標簽查詢集
    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中標簽過濾的寫法:filter(tags__name__in=[tag]),意思是在tags字段中過濾nametag的數據條目。賦值的字符串tag用方括號包起來。

之所以這樣寫是因為Django-taggit還支持多標簽的聯合查詢,比如:

Model.objects.filter(tags__name__in=["tag1", "tag2"])

為了實現帶參數的交叉查詢,還要將翻頁等位置的href修改一下:

templates/article/list.html

...




    最新


...


    最熱


...


    « 1



...

標簽過濾功能就完成了。

Django-taggit更多的用法請閱讀官方文檔:Django-taggit

總結

本章學習了使用Django-taggit來完成標簽功能。

在學習階段,你可以不借助他人的輪子,自己實現功能:瞎折騰對掌握基礎有很大幫助。

實際開發時,又分為兩種情況:

淺層需求某項通用功能,開發完成后改動不大:此類功能建議盡量使用輪子,加快開發效率。人生苦短,能節約的時間,一秒鐘都不要浪費。

需要大量定制化的功能,開發完成后需要頻繁改動:此類功能因為經常對底層代碼進行改動,與其在別人的代碼上修修補補,還不如自己從頭寫了。自己的代碼不僅熟悉,而且都是為定制化而生的。

到底如何選擇,就根據你的喜歡進行斟酌了。


有疑問請在杜賽的個人網站留言,我會盡快回復。

或Email私信我:dusaiphoto@foxmail.com

項目完整代碼:Django_blog_tutorial

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43162.html

相關文章

  • Django搭建個人博客:結束和開始

    摘要:教程看到這里,你已經學會如下內容搭建開發環境博文管理用戶管理發表評論若干小功能搭建簡單的小博客,以上的功能夠用了。教程為了起步平緩,沒有展開這方面的內容。陌生人,祝你學業進步事業有成歡迎常到杜賽的個人網站做客 教程看到這里,你已經學會如下內容: 搭建開發環境 博文管理 用戶管理 發表評論 若干小功能 搭建簡單的小博客,以上的功能夠用了。 相信你的志向不止于此。畢竟程序員面試個個造火...

    zqhxuyuan 評論0 收藏0
  • Django搭建個人博客:使用django-ckeditor富文本編輯器

    摘要:后面兩個編輯器自帶,不用單獨下載,添上就可以了添加相關插件這樣就完成了代碼高亮效果不錯在前臺使用為了讓用戶在前臺也能使用富文本編輯器,還得對代碼稍加改動。對于有些不喜歡的人來說,甚至可以連博文都使用提供的富文本編輯器。 前面我們已經實現了用Markdown語法寫文章了。但是文章的評論用Markdown就不太合適了,你不能強求用戶也花時間去熟悉語法啊。另外評論中通常還有表情、帶顏色的字體...

    beanlam 評論0 收藏0
  • 使用 django-blog-zinnia 搭建個人博客

    摘要:語法支持再次打開文件,在文件的最后添加指明了使用語法標記,做了兩個拓展,其中表示支持語法高亮,包含的特性請參見相關文檔。語法高亮支持注意這一步必須在安裝完主題之后。 目前網上搭建個人博客的方案很多,雖然使用諸如 Wordpress ( PHP )、Hexo ( Node.js ) 等可以方便快速地搭建一款功能齊全的高性能個人博客,但是本文將嘗試一種更為小眾化的方案 —— 一款基于 dj...

    褰辯話 評論0 收藏0
  • Django搭建個人博客:用django-notifications實現消息通知

    摘要:接下來你就可以在項目的任何地方發送通知了像這樣其中的參數釋義發送通知的對象接收通知的對象動詞短語鏈接到動作的對象可選執行通知的對象可選有點繞,舉個栗子杜賽在搭建個人博客中對你發表了評論。有疑問請在杜賽的個人網站留言,我會盡快回復。 憑借你勤奮的寫作,拜讀你文章的用戶越來越多,他們的評論也分散在眾多的文章之中。作為博主,讀者的留言肯定是要都看的;而讀者給你留言,自然也希望得到回復。 怎么...

    Zoom 評論0 收藏0
  • Django搭建個人博客:使用Form表單類發表新文章

    摘要:一些表單界面元素文本框或復選框非常簡單并內置在中,而其他會復雜些像彈出日期選擇等操作控件。和標簽中的屬性指定了當前文本框提交的數據的名稱,它必須與表單類中的字段名稱對應,否則服務器無法將字段和數據正確的對應起來。 前面我們已經學會如何用Markdown語法書寫文章了。 但是還有問題呀。之前寫文章都是在后臺中進行的,萬一有別的普通用戶也要發表文章怎么辦?萬一我想拓展些后臺中沒有的提交驗證...

    Java3y 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<