爲博客添加標籤功能
這裏使用第三方的標籤應用,以提供標籤模型和一個方便的管理器
首先使用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>
至此 詳細頁面看起來這個樣子
至此 博客的基礎功能已經完成,後續將會添加一些高級特性
第三天結束