为博客添加标签功能

这里使用第三方的标签应用,以提供标签模型和一个方便的管理器


首先使用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>


打开浏览器查看

一步一步利用django创建博客应用(三)_python


下面实现一个推荐相似文章的功能,根据标签相同的原理

修改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>


至此 详细页面看起来这个样子

一步一步利用django创建博客应用(三)_python_02


至此 博客的基础功能已经完成,后续将会添加一些高级特性

第三天结束