前言

添加一个文章标签功能.
    感谢大神的教程:Django搭建个人博客.

一.文章标签

1.准备

首先要安装Django-taggit::

pip install django-taggit

安装成功后,修改项目配置,添加库:
settings.py:

INSTALLED_APPS = [...'taggit',
]

2.修改文章模型

article/models.py:

# Django-taggit
from taggit.managers import TaggableManager...
class ArticlePost(models.Model):...# 文章标签tags = TaggableManager(blank=True)...

3.修改文章表单类

article/forms.py:

class ArticlePostForm(forms.ModelForm):class Meta:...fields = ('title', 'body', 'tags')

4.修改发表文章视图

article/views.py:

@login_required(login_url='/userprofile/login/')
def article_create(request):# 判断用户是否提交数据if request.method == "POST":# 将提交的数据赋值到表单实例中article_post_form = ArticlePostForm(data=request.POST)# 判断提交的数据是否满足模型的需求if article_post_form.is_valid():# 保存数据,但暂时不提交到数据库中new_article = article_post_form.save(commit=False)# 指定数据库中,id=1的用户为作者# 如果你进行过删除数据表的操作,可能会找不到id=1的用户# 此时请重新创建用户,并传入此用户idnew_article.author = User.objects.get(id=request.user.id)if request.POST['column'] != 'none':new_article.column = ArticleColumn.objects.get(id=request.POST['column'])# 将新文章保存到数据库中new_article.save()article_post_form.save_m2m()return redirect('article:article_list')else:return HttpResponse('表单内容有误,请重新填写')# 如果用户请求获取数据else:# 创建表单实例article_post_form = ArticlePostForm()columns = ArticleColumn.objects.all()context = {'article_post_form':article_post_form,'columns':columns}return render(request,'article/create.html',context)

5.修改模板,添加表单项

templates/article/create.html:

{% extends "base.html" %}
{% load staticfiles %}{% block title %}}写文章{% endblock %}{% block content %}<!-- 写文章表单 -->
<div class="container"><div class="row"><div class="col-12"><br><!-- 提交文章的表单 --><form method="post" action="."><!-- Django中需要POST数据的地方都必须有csrf_token -->{% csrf_token %}<!-- 文章标题 --><div class="form-group"><!-- 标签 --><label for="title">文章标题</label><!-- 文本框 --><input type="text" class="form-control" id="title" name="title"></div><!-- 文章栏目 --><div class="form-group"><label for="column">栏目</label><select class="form-control"id="column"name="column"><option value="none">请选择栏目..</option>{% for column in columns %}<option value="{{ column.id }}">{{ column }}</option>{% endfor %}</select></div><!-- 文章标签 --><div class="form-group"><label for="tags">标签</label><input type="text"class="form-control col-3"id="tags"name="tags"></div><!-- 文章正文 --><div class="form-group"><label for="body">文章正文</label><!-- 文本区域 --><textarea type="text" class="form-control" id="body" name="body" rows="12"></textarea></div><!-- 提交按钮 --><button type="submit" class="btn btn-primary">完成</button></form></div></div>
</div>
{% endblock %}

6.修改文章列表模板

templates/article/list.html:

<!-- extends表明此页面继承自 base.html 文件 -->
{% extends "base.html" %}
{% load staticfiles %}<!-- 写入 base.html 中定义的 title -->
{% block title %}首页
{% endblock title %}<!-- 写入 base.html 中定义的 content -->
{% block content %}<!-- 定义放置文章标题的div容器 -->
<div class="container"><nav aria-label="breadcrumb"><ol class="breadcrumb"><li class="breadcrumb-item"><a href="{% url 'article:article_list' %}?search={{ search }}&column={{ column }}&tag={{ tag }}">最新</a></li><li class="breadcrumb-item"><a href="{% url 'article:article_list' %}?order=total_views&search={{ search }}&column={{ column }}&tag={{ tag }}">最热</a></li></ol></nav><!-- 新增,搜索栏 --><div class="row"><div class="col-auto mr-auto"><form class="form-inline" ><label class="sr-only">content</label><input type="text"class="form-control mb-2 mr-sm-2"name="search"placeholder="搜索文章..."required></form></div></div><!-- 新增,搜索提示语 -->{% if search %}{% if articles %}<h4><span style="color: red">"{{ search }}"</span>的搜索结果如下:</h4><hr>{% else %}<h4>暂无<span style="color: red">"{{ search }}"</span>有关的文章。</h4><hr>{% endif %}{% endif %}<div class="row mt-2">{% for article in articles %}<!-- 文章内容 --><div class="col-12"><!-- 栏目 -->{% if article.column %}<button type="button"class="btn btn-sm mb-2{% if article.column.title == 'Django' %}btn-success{% elif article.column.title == 'Java' %}btn-danger{% elif article.column.title == 'HTML' %}btn-warning{% endif %}">{{ article.column }}</button>{% endif %}<!-- 标签 --><span>{% for tag in article.tags.all %}<a href="{% url 'article:article_list' %}?tag={{ tag }}"class="badge badge-secondary">{{ tag }}</a>{% endfor %}</span><!-- 标题 --><h4><b><a href="{% url 'article:article_detail' article.id %}"style="color: black;">{{ article.title }}</a></b></h4><!-- 摘要 --><div><p style="color: gray;">{{ article.body|slice:'100' }}...</p></div><!-- 注脚 --><p><!-- 附加信息 --><span style="color: green;">{{ article.total_views }} 浏览&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">{{ article.created|date:'Y-m-d' }} 发布&nbsp;&nbsp;&nbsp;</span><span style="color: darkred;">{{ article.updated|date:'Y-m-d' }} 更新</span></p><hr></div>{% endfor %}
</div>
</div>
<!-- 页码导航 -->
<div class="pagination row"><div class="m-auto"><span class="step-links"><!-- 如果不是第一页,则显示上翻按钮 -->{% if articles.has_previous %}<a href="?page=1&order={{ order }}&search={{ search }}&column={{ column }}&tag={{ tag }}" class="btn btn-success">&laquo; 首页</a><span>...</span><a href="?page={{ articles.previous_page_number }}&order={{ order }}&search={{ search }}&column={{ column }}&tag={{ tag }}"class="btn btn-secondary">{{ articles.previous_page_number }}</a>{% endif %}<!-- 当前页面 --><span class="current btn btn-danger btn-lg">{{ articles.number }}</span><!-- 如果不是最末页,则显示下翻按钮 -->{% if articles.has_next %}<a href="?page={{ articles.next_page_number }}&order={{ order }}&search={{ search }}&column={{ column }}&tag={{ tag }}"class="btn btn-secondary">{{ articles.next_page_number }}</a><span>...</span><a href="?page={{ articles.paginator.num_pages }}&order={{ order }}&search={{ search }}&column={{ column }}&tag={{ tag }}"class="btn btn-success">尾页 &raquo;</a>{% endif %}</span></div>
</div>
{% endblock content %}

7.修改列表视图

article/views.py:

def article_list(request):# 从 url 中提取查询参数search = request.GET.get('search')order = request.GET.get('order')column = request.GET.get('column')tag = request.GET.get('tag')# 初始化查询集article_list = ArticlePost.objects.all()# 搜索查询集if search:article_list = article_list.filter(Q(title__icontains=search) |Q(body__icontains=search))else:search = ''# 栏目查询集if column is not None and column.isdigit():article_list = article_list.filter(column=column)# 标签查询集if tag and tag != 'None':article_list = article_list.filter(tags__name__in=[tag])# 查询集排序if order == 'total_views':article_list = article_list.order_by('-total_views')paginator = Paginator(article_list, 3)page = request.GET.get('page')articles = paginator.get_page(page)# 需要传递给模板(templates)的对象context = {'articles': articles,'order': order,'search': search,'column': column,'tag': tag,}return render(request, 'article/list.html', context)

写在最后

本文是个人的一些学习笔记,如有侵权,请及时联系我进行删除,谢谢大家.

Django做一个简单的博客系统(14)----增加文章标签相关推荐

  1. Django做一个简单的博客系统(13)----增加文章栏目

    前言 添加一个文章栏目功能.     感谢大神的教程:Django搭建个人博客. 一.文章栏目 1.修改模型 article/models.py: ...class ArticleColumn(mod ...

  2. Django做一个简单的博客系统(11)----搜索文章

    前言 实现一个简单的搜索文章的功能.     感谢大神的教程:Django搭建个人博客. 一.搜索文章 1.修改视图函数 article/views.py: def article_list(requ ...

  3. Django做一个简单的博客系统(10)----最热文章

    前言 上一篇文章实现了统计文章浏览量的功能,那么随之而来的就是实现最新最热文章的功能.     感谢大神的教程:Django搭建个人博客. 一.最新,最热文章 其实最热文章功能实现原理很简单,就是根据 ...

  4. django初探-创建简单的博客系统(一)

    django第一步 1. django安装 pip install django print(django.get_version()) 查看django版本 2. 创建项目 打开cmd,进入指定目录 ...

  5. [Django快速开发1]搭建一个简单的博客系统(1)

    系列文章目录 Django快速开发0快速搭建环境并得到django项目的hello world 文章目录 系列文章目录 前言 从Django的模型层开始书写 定义文章模型: 使用脚本向sqlite3中 ...

  6. php ci框架后台管理,ci: 羽翼后台管理平台是一个简单的博客系统,后端基于CodeIgniter,前端基于Semantic UI 2.2.10...

    羽翼后台管理平台(博客系统) 羽翼的由来 羽翼的故事是9月20日的晚上,我突然就想到--造翼者小说.我通过自己构思不少的东西.羽毛代表着轻松.纯洁和神圣的:翼代表着升天和梦想,两者在一起的含义:带着一 ...

  7. SpringBoot+Vue快速搭建简单个人博客系统之后端

    我是markerhub作者的一名粉丝,最初在markerhub公众号关注了博主,去B站白嫖了博主的基于SpringBoot+Vue开发的前后端分离博客项目完整教学的视频教程,看一遍跟着老师敲一遍,有的 ...

  8. 用RC522与arduino做一个简单的门禁系统

    用RC522与arduino做一个简单的门禁系统 插本成功要去新学校了,结果发现新学校宿舍没有电梯没有电子门(虽然海景房很香).这对于住惯养老院的我属实难受所所以打算自己也整一个IC卡的门禁系统.然后 ...

  9. 用koa mongodb 做了个简单的博客系统

    最近在研究koa和mongodb,简单做了个博客系统,目前还未开放评论和发帖功能,欢迎大家吐槽~ ?安装 git clone https://github.com/oliyg/alljscc.git ...

最新文章

  1. Java基础之I/O流
  2. 一种解决 MacBook 里的 App Store 无法登录的问题
  3. 利用data store在不同模型中传递数据
  4. matlab cd参数,MATLAB变量参数列表​
  5. 将区块链哈希转化为文字标题?IPSE哈希技术Hashlink解释
  6. Java-数组的使用
  7. 前端居中模板(常用HTML模板)
  8. 学生用计算机shift,电脑Shift键你会用吗
  9. 当前计算机技术与医学结合的研究热点,改进的模糊遗传算法在医学中的应用和研究...
  10. python安卓下载-python手册中文版apk下载
  11. mysql5.5创建学生情况表_数据库中创建一个学生表
  12. 通用即插即用监视器驱动下载_请你给广色域显示器装下驱动好么? 尤其是k7b小金刚以及nano ips面板显示器的用户...
  13. silvaco学习笔记—— Automatic Meshing
  14. hdu 5857 Median ★
  15. UMD算法讲义——Lecture 3:算法设计回顾:数学背景
  16. [剑指Offer]丑数[Python]
  17. 谷歌中国宣布启用简短域名g.cn
  18. 从Otherside土地稀缺体系聊起, Yuga Labs到底在布局什么?
  19. 计算广告4——用户增长
  20. 头牌知产介绍速冻水饺商标属于哪一类

热门文章

  1. Java人的第一把锁——synchronized
  2. Jenkins持续集成自动化测试实战(下篇)
  3. cadence virtuoso VIVA及calculator
  4. 简单易懂的解释什么是WebAssembly
  5. 走近 WebAssembly 之调试大法
  6. zed双目摄像头 +yolo进行双目测距
  7. Oracle AWR 介绍 1
  8. 大部分的期货品种开户是没有门槛
  9. js的settimeout用法总结
  10. 一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度