一、前言
在逛开源中国社区的时候,发现每一篇博客下面都有一行文章的标签,大概就是文章中的代码类型以及使用到的模块之类的。如下图,我的开源中国社区地址是:https://my.oschina.net/zhenfei,用了一段时间后废弃了,转到了博客园,所以上面的文章是不全的。
转而想到自己的网站,我也想添加一个这样的功能。那么在Django中,非常轻松地就能通过ManyToManyField字段来将文章与标签相互关联。先看一个官方文档的例子来说明下:
@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简单地演示一下:
# 创建出版商 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>]>
下面就开始在自己网站中实现这一功能。
二、开发流程
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中
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我这里省略了,比较简单。
{% 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 %}
这就算完成了,在后台添加好标签。最后展示如下:
原文出处:https://jzfblog.com/detail/127,文章的更新编辑以此链接为准。欢迎关注源站文章!