二十、Django2.1 搭建多用户的博客网站——文章标签

目录:Django 2.1 从零开始搭建博客网站系列

服务器环境搭建(选学)

  • 在阿里云服务器从零开始上线Django项目:Ubuntu18.04+Python3+Django2,并通过公网IP访问

小试牛刀——简单的博客网站

  • 一、Django2.1 搭建简单的博客网站
  • 二、Django2.1 搭建简单的博客网站扩展——自定义模板和静态文件位置

庖丁解牛——多用户的博客网站之用户模块

  • 三、Django2.1 搭建多用户的博客网站——登录
  • 四、Django2.1 搭建多用户的博客网站——注册
  • 五、Django2.1 搭建多用户的博客网站——修改密码
  • 六、Django2.1 搭建多用户的博客网站——重置密码
  • 七、Django2.1 搭建多用户的博客网站——维护个人详细信息
  • 八、Django2.1 搭建多用户的博客网站——头像上传
  • 九、Django2.1 搭建多用户的博客网站——用户模块小结

庖丁解牛——多用户的博客网站之文章模块

  • 十、Django2.1 搭建多用户的博客网站——文章栏目
  • 十一、Django2.1 搭建多用户的博客网站——简单的文章发布
  • 十二、Django2.1 搭建多用户的博客网站——使用Markdown发布文章
  • 十三、Django2.1 搭建多用户的博客网站——修改和删除文章
  • 十四、Django2.1 搭建多用户的博客网站——向用户展示文章
  • 十五、Django2.1 搭建多用户的博客网站——文章模块小结

华丽转身——多用户的博客网站之扩展功能

  • 十六、Django2.1 搭建多用户的博客网站——文章点赞功能
  • 十七、Django2.1 搭建多用户的博客网站——统计文章浏览次数
  • 十八、Django2.1 搭建多用户的博客网站——文章评论功能
  • 十九、Django2.1 搭建多用户的博客网站——使用自定义模板标签
  • 二十、Django2.1 搭建多用户的博客网站——文章标签
  • 二十一、Django2.1 搭建多用户的博客网站——美图模块
  • 未完待续

项目源码下载:https://github.com/jt1024/lehehe

正文:

本文的“文章标签”不同于上篇的“模板标签”,这里的文章标签就是文章作者可以为自己的文章设置标签,也就是文章的关键词。

有一个名称为 django-taggit 的应用可以直接管理文章标签,官方网站是 https://django-taggit.readthedocs.io/en/latest/index.html

1、添加文章标签

1.1 文章标签的数据模型类

在./article/models.py中新增数据模型

class ArticleTag(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="tag")
    tag = models.CharField(max_length=500)

    def __str__(self):
        return self.tag

以上代码要写在 ArticlePost 之前,并在 ArticlePost 中新增一行代码:

article_tag = models.ManyToManyField(ArticleTag, related_name='article_tag', blank=True)

执行以下代码更新数据库

python manage.py make migrations
python manage.py migrate

1.2 文章标签的表单类

在./article/forms.py中新增表单

from .models import ArticleTag

class ArticleTagForm(forms.ModelForm):
    class Meta:
        model = ArticleTag
        fields = ('tag',)

1.3 视图函数

在./article/views.py中新增article_tag函数

@login_required(login_url='/account/login')
@csrf_exempt
def article_tag(request):
    if request.method == "GET":
        article_tags = ArticleTag.objects.filter(author=request.user)
        article_tag_form = ArticleTagForm()
        return render(request, "article/tag/tag_list.html", {"article_tags": article_tags, "article_tag_form": article_tag_form})

    if request.method == "POST":
        tag_post_form = ArticleTagForm(data=request.POST)
        if tag_post_form.is_valid():
            try:
                new_tag = tag_post_form.save(commit=False)
                new_tag.author = request.user
                new_tag.save()
                return HttpResponse("1")
            except:
                return HttpResponse("the data cannot be save.")
        else:
            return HttpResponse("sorry, the form is not valid.")

1.4 设置路由

在./article/urls.py中新增路由

path('article-tag/', views.article_tag, name="article_tag"),

1.5 文章标签的模板文件

编辑 ./templates/article/leftsider.html,在有关文章的操作中增加如下一项

文章标签

创建 ./templates/article/tag/tag_list.html

{% extends "article/base.html" %}
{% load staticfiles %}
{% block title %}articles tag{% endblock %}
{% block content %}

添加文章标签

{% csrf_token %}
文章标签
{{article_tag_form.tag}}

已有标签列表

{% for article_tag in article_tags %} {% empty %}

现在还没有标签,请添加

{% endfor %}
序号 文章标签 操作
{{ forloop.counter }} {{ article_tag.tag }} --
{% endblock %}

1.6 测试

访问 http://127.0.0.1:8000/article/article-tag

二十、Django2.1 搭建多用户的博客网站——文章标签_第1张图片
增加文章标签

2、删除文章标签

2.1 视图函数

在./article/views.py中新增del_article_tag函数

@login_required(login_url='/account/login') 
@require_POST
@csrf_exempt
def del_article_tag(request):
    tag_id = request.POST['tag_id'] 
    try:
        tag = ArticleTag.objects.get(id=tag_id) 
        tag.delete()
        return HttpResponse("1")
    except:
        return HttpResponse("2")

2.2 设置路由

在./article/urls.py中新增路由

path('del-article-tag/', views.del_article_tag, name="del_article_tag"),

2.3 模板文件

修改 ./templates/article/tag/tag_list.html

{% extends "article/base.html" %}

{% load staticfiles %}

{% block title %}articles tag{% endblock %}

{% block content %}

添加文章标签

{% csrf_token %}
文章标签
{{article_tag_form.tag}}

已有标签列表

{% for article_tag in article_tags %} {% empty %}

You have no article tags. Please add them.

{% endfor %}
序号 文章标签 操作
{{ forloop.counter }} {{ article_tag.tag }}
{% endblock %}

2.4 测试

访问 http://127.0.0.1:8000/article/article-tag 点击删除图标

二十、Django2.1 搭建多用户的博客网站——文章标签_第2张图片
删除图标

3、发布文章时选择标签

3.1 视图函数

在./article/views.py中修改article_post函数

import json

@login_required(login_url='/account/login')
@csrf_exempt
def article_post(request):
    if request.method == "POST":
        article_post_form = ArticlePostForm(data=request.POST)
        if article_post_form.is_valid():
            cd = article_post_form.cleaned_data
            try:
                new_article = article_post_form.save(commit=False)
                new_article.author = request.user
                new_article.column = request.user.article_column.get(id=request.POST['column_id'])
                new_article.save()
                tags = request.POST['tags']
                if tags:
                    for atag in json.loads(tags):
                        tag = request.user.tag.get(tag=atag)
                        new_article.article_tag.add(tag)
                return HttpResponse("1")
            except:
                return HttpResponse("2")
        else:
            return HttpResponse("3")
    else:
        article_post_form = ArticlePostForm()
        article_columns = request.user.article_column.all()
        article_tags = request.user.tag.all()
        return render(request, "article/column/article_post.html", {"article_post_form": article_post_form, "article_columns": article_columns, "article_tags": article_tags})

3.2 模板文件

修改 ./templates/article/column/article_post.html

{% extends "article/base.html" %}
{% load staticfiles %}
{% block title %}article column{% endblock %}
{% block content %}



{% csrf_token %}
标题:
{{article_post_form.title}}
栏目:
文章标签:
{% for tag in article_tags %} {% empty %}

You have not type tags for articles. Please input your tags

{% endfor %}
内容:
{% endblock %}

访问 http://127.0.0.1:8000/article/article-post/

二十、Django2.1 搭建多用户的博客网站——文章标签_第3张图片
发布文章时增加标签

3.3 在文章中显示文章标签

修改 ./templates/article/list/article_content.html 在作者、点赞计数那一行的下面增加如下代码

Tags: {{ article.article_tag.all | join:", "}}

3.4 测试

访问刚才发表的文章,文章标签已显示在文章详情中了


显示文章标签

4、通过文章标签推荐相似文章

4.1 视图函数

在./article/list_views.py中修改article_detail函数

def article_detail(request, id, slug):
    article = get_object_or_404(ArticlePost, id=id, slug=slug)
    total_views = r.incr("article:{}:views".format(article.id))
    r.zincrby('article_ranking', 1, article.id)

    article_ranking = r.zrange("article_ranking", 0, -1, desc=True)[:10]
    article_ranking_ids = [int(id) for id in article_ranking]
    most_viewed = list(ArticlePost.objects.filter(id__in=article_ranking_ids))
    most_viewed.sort(key=lambda x: article_ranking_ids.index(x.id))

    if request.method == "POST":
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():
            new_comment = comment_form.save(commit=False)
            new_comment.article = article
            new_comment.save()
    else:
        comment_form = CommentForm()

    article_tags_ids = article.article_tag.values_list("id", flat=True)
    similar_articles = ArticlePost.objects.filter(article_tag__in=article_tags_ids).exclude(id=article.id)
    similar_articles = similar_articles.annotate(same_tags=Count("article_tag")).order_by('-same_tags', '-created')[:4]
    return render(request, "article/list/article_content.html",
                  {"article": article, "total_views": total_views, "most_viewed": most_viewed, "comment_form": comment_form, "similar_articles": similar_articles})

4.2 模板文件

修改 ./templates/article/list/article_content.html 在“最多评论文章”栏目代码的下面增加如下代码


推荐相似文章

    {% for similar in similar_articles %}
  • {{ similar.title }}

  • {% empty %}

    Sorry, 没有相似文章

    {% endfor %}

4.3 测试

访问刚才发表的文章,右下角已显示“ 推荐相似文章”栏目


推荐相似文章

你可能感兴趣的:(二十、Django2.1 搭建多用户的博客网站——文章标签)