Django之博客系统:增加标签
一般在发表博客后会给每个帖子加上一个标签。类似帖子关键字的功能。在这一章中来看下如何给博客添加标签功能(tagging)
添加标签需要集成第三方的Django标签应用来完成这个功能。django-taggit是一个可复用的应用,它会提供给你一个Tag模型(model)和一个管理器(manager)来方便的给任何模型(model)添加标签
安装好后,首先在setting.py中引用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
'taggit',
]
打开你的blog应用下的model.py文件,给Post模型(model)添加django-taggit提供的TaggableManager管理器(manager),使用如下代码:这个tags管理器(manager)允许你给Post对象添加,获取以及移除标签
from taggit.managers import TaggableManager
class Post(models.Model):
tags=TaggableManager()
class Meta:
ordering=('-publish',)
def __str__(self):
return self.title
既然修改了模型,那么就需要同步数据库进行迁移。
zhf@zhf-maple:~/py_prj/mysite$ python manage.py makemigrations
Migrations for 'blog':
blog/migrations/0004_post_tags.py
- Add field tags to post
zhf@zhf-maple:~/py_prj/mysite$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, blog, contenttypes, sessions, taggit
Running migrations:
Applying taggit.0001_initial... OK
Applying taggit.0002_auto_20150616_2121... OK
Applying blog.0004_post_tags... OK
然后我们在命令行来测试下是否可用。打开终端运行命令python manage.py shell
In [1]: from blog.models import Post
#取得Post模型并进行tag添加
In [2]: post=Post.objects.get(id=1)
In [4]: post.tags.add('java','c++','python')
#显示所有的tag
In [5]: post.tags.all()
Out[5]: <QuerySet [<Tag: python>, <Tag: java>, <Tag: c++>]>
#移除其中一个tag
In [6]: post.tags.remove('c++')
In [7]: post.tags.all()
Out[7]: <QuerySet [<Tag: python>, <Tag: java>]>
接下来运行服务器。来到后台查看下。可以看到新增了标签页面
点击进去可以看到我们添加的标签
此外我们进入具体的帖子
http://127.0.0.1:8000/admin/blog/post/ 也可以对标签进行编辑
接下来我们要做的就是在模板中将这些标签给显示出来。
在list.html中添加如下来显示标签
<p class="tags">标签:{{ p.tags.all|join:"," }}</p>
join模板(template)过滤器(filter)的功能类似python字符串的join()方法,将给定的字符串连接起来。在浏览器中打开 http://127.0.0.1:8000/blog/ 。 你会看到每一个帖子的标题下面的标签列表: