为博客添加标签功能
这里使用第三方的标签应用,以提供标签模型和一个方便的管理器
首先使用pip 安装标签模块
pip install django-taggit==0.17.1
在setting.py 中 激活标签应用
在model.py中Post模型中添加标签管理器
from taggit.managers import TaggableManager class Post(models.Model): # ... tags = TaggableManager()
同步数据库
编辑list.html 显示标签
<p class="tags"> Tags: {{ post.tags.all | join: ", " }} </p>
下面实现按照标签来分类文章
修改post_list视图
tag = None if tag_slug: tag = get_object_or_404(Tag, slug=tag_slug) object_list = object_list.filter(tags__in=[tag])
添加tag的url
url(r'^tag/(?P<tag_slug>[-\w]+)/$', views.post_list, name='post_list_by_tag'),
修改list.html
{% if tag %} <h2>Posts tagged with "{{ tag.name }}"</h2> {% endif %} <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>
打开浏览器查看
下面实现一个推荐相似文章的功能,根据标签相同的原理
修改post_detail视图
post_tags_ids = post.tags.values_list('id', flat=True) # 当前post的tags在数据库中的id # print(post_tags_ids) similar_posts = Post.published.filter(tags__in=post_tags_ids).exclude(id=post.id) similar_posts = similar_posts.annotate(same_tags=Count('tags')).order_by('-same_tags','-publish')[:4]
修改detail.html模板,在前台展示相似文章
<h2>Similar posts</h2> {% for post in similar_posts %} <p> <a href="{{ post.get_absolute_url }}">{{ post.title }}</a> </p> {% empty %} There are no similar posts yet. {% endfor %}
顺便在detail模板 加上标签
<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>
至此 详细页面看起来这个样子
至此 博客的基础功能已经完成,后续将会添加一些高级特性
第三天结束