在逛開源中國社區的時候,發現每一篇博客下面都有一行文章的標籤,大概就是文章中的代碼類型以及使用到的模塊之類的。以下圖,個人開源中國社區地址是:https://my.oschina.net/zhenfei。html
轉而想到本身的網站,我也想添加一個這樣的功能。那麼在Django中,很是輕鬆地就能經過ManyToManyField字段來將文章與標籤相互關聯。先看一個官方文檔的例子來講明下:python
@python_2_unicode_compatibleclass Publication(models.Model): title = models.CharField(max_length=30) def __str__(self): return self.title @python_2_unicode_compatibleclass Article(models.Model): headline = models.CharField(max_length=100) publications = models.ManyToManyField(Publication, related_name='publications_article') def __str__(self): return self.headline
使用shell簡單地演示一下:shell
# 建立出版商 In [4]: p1 = Publication.objects.create(title='hello') # 建立文章 In [5]: a1 = Article.objects.create(headline='django') # 此時出版商和文章尚未對應添加到 publication_article 表中,獲取爲空 In [6]: p1.publications_article.all() Out[6]: <QuerySet []> In [7]: p1.publications_article.add(a1) # 獲取此出版商出版的文章 In [8]: p1.publications_article.all() Out[8]: <QuerySet [<Article: django>]> # 獲取出版此文章的出版商 In [9]: a1.publications.all() Out[9]: <QuerySet [<Publication: hello>]>
下面就開始在本身網站中實現這一功能。django
1.新建Tag模型類框架
from django.db import models class Tag(models.Model): """ 標籤 Tag 也比較簡單,和 Category 同樣。 再次強調必定要繼承 models.Model 類! """ name = models.CharField(max_length=100, verbose_name=u'標籤') class Meta: verbose_name = '標籤' verbose_name_plural = '標籤' def __str__(self): return self.name
2.經過ManyToManyField將文章與標籤關聯
在文章Post模型類中,加上工具
tags = models.ManyToManyField(Tag, blank=True, verbose_name=u'標籤', related_name='tag_post')
3.將Tag模型類註冊在xadmin中post
import xadmin from .models import Tag class TagAdmin(object): """ 做用:自定義標籤管理工具 admin.ModelAdmin:繼承admin.ModelAdmin類 """ # 在後臺顯示od值,標籤名 list_display = ['id', 'name'] # 增長過濾框,且以文章分類做過濾器 list_filter = ['name'] # 增長文章標題搜索字段 search_fields = ['name'] # 後臺管理每頁顯示20篇文章標題 xadmin.site.register(Tag, TagAdmin)
4.定義一個模板標籤
具體使用方法,請參考:Django框架13: 自定義過濾器和標籤。網站
from django import template register = template.Library() @register.simple_tag def get_post_tags(obj): """ 獲取文章下的全部標籤 :param post: 博客 :return: 標籤列表 """ tags_list = obj.tags.all() return tags_list
5.最後在網頁模板中加載
具體的CSS我這裏省略了,比較簡單。spa
{% get_post_tags post as tags_list %} {% if tags_list %} <div class="blog-tags"> {% for tag in tags_list %} <span>{{ tag }}</span> {% endfor %} </div> {% endif %}
這就算完成了,最後展現以下:.net
原文出處:https://www.jzfblog.com/detail/127,文章的更新編輯以此連接爲準。歡迎關注源站文章!