添加標簽功能

添加標簽功能

在實現(xiàn)你的評論系統(tǒng)之后刷喜,你需要創(chuàng)建一個方法去標注你的博客(就是貼標簽)蒸绩。你可以通過整合第三方Django 標簽 應用程序到你的項目中去 做這些。django-taggit 是一個可復用的 應用程序,主要為你提供 Tag 模型骡尽,以及一個很簡單的在任何模型中添加標簽的管理器。 你可以在這個鏈接看到它的源代碼擅编;

首先你需要pip 允許下面的代碼去安裝 django-taggit

pip install django_taggit==1.2.0

這是攀细,打開mysite項目的settings.py 文件,并且在 INSTALLED_APPS 設置中添加 taggit, 如下:

image.png

打開你 blog 應用程序的 models.py 文件沙咏,并且在Post 模型中添加一個 通過 django-taggit 提供的 TaggableManager 管理器辨图,使用下面的代碼:

from taggit.managers import TaggableManager


class Post(models.Model):
    # ....
    tags = TaggableManager()

這個 tags 管理器將允許你 從 Post 對象中添加,檢索肢藐,刪除標簽故河。

允許下面的命令為你模型的更改創(chuàng)建一個遷移:
python manage.py makemigrations blog

你將得到下面的輸出:


image.png

現(xiàn)在,運行下面的命令為 django-taggit 模型去創(chuàng)建數(shù)據(jù)庫必須的表吆豹,并且同步你模型的更改鱼的。
python manage.py migrate

你將看到一些輸出,表明這個遷移已經(jīng)被應用了痘煤,如下:


image.png

你的數(shù)據(jù)庫現(xiàn)在準備去使用 django-taggit 模型了凑阶。

讓我們?nèi)ヌ剿魅绾稳ナ褂?tags 管理器。通過 python manage.py shell 命令打開終端衷快,并且輸入下面的代碼宙橱。首先將將檢索到你的一個帖子。(這個 帖子的ID = 1):

>>> from blog.models import Post
>>> post = Post.objects.get(id=1)

這時蘸拔,去給它添加一些標簽师郑,并且檢索這些標簽,檢查它們是否被成功添加:

>>> post.tags.add('music', 'jazz', 'django')
>>> post.tags.all()
<QuerySet [<Tag: django>, <Tag: music>, <Tag: jazz>]>

最后调窍,移除一個標簽宝冕,并且再次檢查這個標簽列表:

>>> post.tags.remove('django')
>>> post.tags.all()
<QuerySet [<Tag: music>, <Tag: jazz>]>

比較簡單,對吧邓萨?運行 python manage.py runserver 命令再次去打開開發(fā)者服務器地梨,并且在你的瀏覽器中打開 http://127.0.0.1:8000/admin/taggit/tag/

你將看到taggit 應用程序的帶有Tag 對象列表的管理員頁面。

image.png

導航到 http://127.0.0.1:8000/admin/blog/post/缔恳, 點擊一個帖子去編輯他宝剖。 你將看到現(xiàn)在的帖子包含一個 性的 Tags 字段,如下歉甚,這里可以很簡單的編輯標簽:

image.png

現(xiàn)在诈闺,你需要去編輯你的 博客帖子去顯示標簽。打開 blog/post/list.html 模板铃芦,并且去添加下面的 HTML 代碼雅镊,在 帖子 標題之后襟雷。

<p class="tags">Tags: {{ post.tags.all|join:", " }}</p>

這個 join 摹本過濾器工作和 Python 字符串的 join() 方法工作相似,用給定的字符串連接元素仁烹。在瀏覽器中打開 http://127.0.0.1:8000/blog/耸弄。 你應該能在每一個 帖子 標題下面看到標簽列表。

image.png

下一步卓缰,你將編輯 post_list 視圖去讓用戶列出所有指定標簽的帖子计呈。打開你 blog 應用程序的 views.py 文件。從django-taggit 中導入 Tag 模型征唬,并且修改 post_list 使用一個可選的標簽過濾帖子捌显。如下:

from taggit.models import Tag
def post_list(request, tag_slug=None):
    object_list = Post.published.all()
    tag = None

    if tag_slug:
        tag = get_object_or_404(Tag, slug=tag_slug)
        object_list = object_list.filter(tags__in=[tag])
    paginator = Paginator(object_list, 3)  # 每 3 篇博客一頁
  # .....

post_list 視圖現(xiàn)在工作如下:

  1. 它提供了一個 tag_slug 可選參數(shù),它有一個 None 默認值总寒。這個參數(shù)將在 URL 中傳遞扶歪。
  2. 在視圖內(nèi)部,您構(gòu)建初始的查詢集摄闸,檢索所有已發(fā)布的帖子善镰,如果這里提供了 標簽 slug。你可以用 slug 使用 get_object_or_404() 快捷方式得到 Tag 對象年枕。
  3. 然后炫欺,通過包含給定標記的文章來篩選文章列表,因為這是一個 多對多的關系熏兄,您必須根據(jù)給定列表中包含的標記篩選帖子品洛,在這個例子中,該元素只包含一個元素摩桶。使用 __in 字段進行查找桥状。多對多關系發(fā)生在一個模型的多個對象和另一個模型的多個對象之間的聯(lián)系。在你的應用程序中典格,一個帖子可以有多個標簽并且一個標簽可以關聯(lián)多個帖子岛宦。你可以學習更多創(chuàng)建多對多關系台丛。在第五章:在你的網(wǎng)站中分享內(nèi)容耍缴。你也可以在這個鏈接中發(fā)現(xiàn)更多有關的知識。

請記住挽霉,查詢集是惰性的防嗡。只有在呈現(xiàn)模板時對 post 列表進行循環(huán)時,才會計算用于檢索 post 的查詢集侠坎。

最后蚁趁,在視圖的底部修改 render() 函數(shù),通過 tag 變量渲染到模板中实胸, 這個視圖看起來像這個樣子:

def post_list(request, tag_slug=None):
    object_list = Post.published.all()
    tag = None

    if tag_slug:
        tag = get_object_or_404(Tag, slug=tag_slug)
        object_list = object_list.filter(tags__in=[tag])

    paginator = Paginator(object_list, 3)  # 每 3 篇博客一頁
    page = request.GET.get('page')

    try:
        posts = paginator.page(page)
    except PageNotAnInteger:
        # 如果頁面不是整數(shù)他嫡,就返回第一頁
        posts = paginator.page(1)
    except EmptyPage:
        #  如果頁面超出范圍番官,就提交結(jié)果的最后一頁
        posts = paginator.page(paginator.num_pages)

    return render(request,
                  'blog/post/list.html',
                  {'posts': posts,
                   'tag': tag,
                   'page': page})

打開你 blog 應用程序的 urls.py 文件,注釋掉基于類的 PoslListView url 模式钢属。取消掉 post_list 視圖徘熔,如下:

path('', views.post_list, name='post_list'),
# path('', views.PostListView.as_view(), name='post_list'),

添加以下附加的URL模式來按標記列出文章:

    path('tag/<slug:tag_slug>/',
         views.post_list, name='post_list_by_tag'),

正如你所見的,兩個模式都指向了相同的視圖淆党,但是你使用名稱區(qū)分它們酷师。第一個模式調(diào)用 post_list 視圖 時沒有任何可選參數(shù)。第二個模式調(diào)用 post_list 視圖的時候使用了 tag_slug 參數(shù)染乌。你使用一個 slug 路徑轉(zhuǎn)換器 將 參數(shù)匹配為 帶有 ASCII 字母或數(shù)字的小寫字符串山孔,加上連字符和下劃線字符。

自從你使用了 post_list 視圖荷憋,編輯 blog/post/list.html 模板台颠,并且去使用 posts 對象 修改 分頁器:
{% include "pagination.html" with page=posts %}

{% for %} 循環(huán)之上添加下面這些行:

    {% if tag %}
        <h2> Posts tagged with "{{ tag.name }}" </h2>
    {% endif %}

如果一個用戶訪問這個 博客,它將看到一個所有帖子的列表台谊。如果他們通過貼有特殊標簽的過濾帖子蓉媳,他們將看到他們正在過濾的標簽。

現(xiàn)在锅铅,改變標簽的顯示方式酪呻,如下:

<p class="tags">
    Tags:
    {% for tag in post.tags.all %}
        <a href="{% url "blog:post_list_by_tag" tag.slug %}">
            {{ tag.name }}
        </a>
        {% if not forloop.last %}, {% endif %}
    {% endfor %}
</p>

在上面的代碼中,循環(huán)一個 post 的所有標記盐须,顯示一個到 URL 的自定義鏈接玩荠,以通過該標記篩選 post。你使用 {% url "blog:post_list_by_tag" tag.slug %},使用URL名稱和slug標記作為其參數(shù)贼邓。用逗號分隔標簽阶冈。

在你的瀏覽器中打開 http://127.0.0.1:8000/blog/,并且點擊任何一個 tag 鏈接塑径。您將看到使用該標記的文章列表女坑,如下:

image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市统舀,隨后出現(xiàn)的幾起案子匆骗,更是在濱河造成了極大的恐慌,老刑警劉巖誉简,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碉就,死亡現(xiàn)場離奇詭異,居然都是意外死亡闷串,警方通過查閱死者的電腦和手機瓮钥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碉熄,你說我怎么就攤上這事桨武。” “怎么了锈津?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵玻募,是天一觀的道長。 經(jīng)常有香客問我一姿,道長七咧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任叮叹,我火速辦了婚禮艾栋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛉顽。我一直安慰自己蝗砾,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布携冤。 她就那樣靜靜地躺著悼粮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪曾棕。 梳的紋絲不亂的頭發(fā)上扣猫,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音翘地,去河邊找鬼申尤。 笑死,一個胖子當著我的面吹牛衙耕,可吹牛的內(nèi)容都是我干的昧穿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼橙喘,長吁一口氣:“原來是場噩夢啊……” “哼时鸵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厅瞎,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤饰潜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后磁奖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囊拜,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡某筐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年比搭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡身诺,死狀恐怖蜜托,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霉赡,我是刑警寧澤橄务,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站穴亏,受9級特大地震影響蜂挪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗓化,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一棠涮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刺覆,春花似錦严肪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至氢橙,卻和暖如春酝枢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悍手。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工隧枫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谓苟。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓官脓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涝焙。 傳聞我的和親對象是個殘疾皇子卑笨,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355