一步一步利用django創建博客應用(三)

爲博客添加標籤功能

這裏使用第三方的標籤應用,以提供標籤模型和一個方便的管理器


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


打開瀏覽器查看

wKioL1b_6GKRM0AtAAKwRu2PCDk483.jpg


下面實現一個推薦相似文章的功能,根據標籤相同的原理

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


至此 詳細頁面看起來這個樣子

wKioL1b_9D7QAHOgAAJExPASXxM136.jpg


至此 博客的基礎功能已經完成,後續將會添加一些高級特性

第三天結束

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章