Python + Django4 搭建个人博客(十八):让文章按热度和时间排序

目录

统计文章浏览量

修改模型

修改视图

修改列表模板

修改详情模板

热度和时间排序

修改视图

修改模板

结语


 浏览量或者说文章热度是评估一篇博文质量的重要指数。一般的博客网站都具备统计以及按照浏览量排序的功能。

本文我们来实现博文浏览的统计,同时增加按照热度和时间排序的功能。

统计文章浏览量

修改模型

要实现浏览量功能,我们首先需要增加一个浏览量字段。

因此修改文章的模型:

# 博客文章数据模型
class Article(models.Model):
    # 文章id,主键
    id = models.AutoField(primary_key=True)

    # 文章作者。修改为User的外键,参数 on_delete 用于指定数据删除的方式
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    # 文章标题,models.CharField 为字符串字段,用于保存较短的字符串,比如标题
    title = models.CharField('标题',max_length=100)

    # 文章正文,保存大量文本使用 TextField
    body = models.TextField('文章正文')

    # 文章创建时间,参数 default=timezone.now 指定其在创建数据时将默认写入当前的时间
    created = models.DateTimeField(default=timezone.now)
    #增加浏览量字段
    total_views = models.PositiveIntegerField(default=0)

    # 文章更新时间,参数 auto_now=True 指定每次数据更新时自动写入当前时间
    updated = models.DateTimeField(auto_now=True)
    # 获取文章地址
    def get_absolute_url(self):
        return reverse('detail', args=[self.id])
  • PositiveIntegerField是用于存储正整数的字段
  • default=0设定初始值从0开始

迁移下数据

python manage.py makemigrations

python manage.py migrate

修改视图

我们需要实现的是每当用户访问详情页面时,浏览量就加1。

因此修改article_detail()如下:

# 文章详情
def article_detail(request,id):
    # 取出相应的文章
    article = Article.objects.get(id=id)
    # 浏览量 +1
    article.total_views += 1
    article.save(update_fields=['total_views'])
    # 取出文章评论
    comments = Comment.objects.filter(article=id)
    # 需要传递给模板的对象
    context = {'article': article, 'comments': comments}
    # 载入模板,并返回context对象
    return render(request, 'article/detail.html', context)

update_fields=[]指定了数据库只更新total_views字段,优化执行效率。

修改列表模板

首先我们在列表的每个文章卡片上都加上一个阅读量的显示。

这里我们为了美观,我们加上一个阅读量的图标。

使用图标我们需要引入图标库,这里我们通过在线形式引入。

templates/base.html中增加如下代码:

<!--    载入静态文件-->
{% load static %}

<!DOCTYPE html>
<!-- 网站主语言 -->
<html lang="zh-cn">
  <head>
    <!-- 网站采用的字符编码 -->
    <meta charset="utf-8">
    <!-- 预留网站标题的位置 -->
    <title>{% block title %}{% endblock %}</title>
    <!-- 引入bootstrap的css文件  -->
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <!-- 引入图标库 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css">
  </head>

然后在templates/article/list.html 中增加代码如下:

      	...
						<div class="card-body">
                    <h4 class="card-title">{{ article.title }}</h4>
                    <br>
                    <p class="card-text">{{ article.body|slice:'100' }}...</p>
                    <a href="{% url 'detail' article.id %}"  class="card-link">阅读本文</a>
                    <!-- 这里增加阅读量和图标 -->
                        <small class="col align-self-end" style="color: gray;">
                            <span class="bi bi-eye">
                            {{ article.total_views }}
                            </span>
                        </small>
                </div>

实现效果如下:

修改详情模板

 

类似的,我们在详情页面标题后面也增加图标和阅读量。

<div class="col-12 alert alert-primary">
            <div class="col-12">
                <a>作者:{{ article.author }}</a>
                &nbsp
                <a>{{ article.created|date:'Y-m-d H:i:s' }}</a>
                &nbsp
                <!-- 只有作者可以修改文章 -->
                {% if user == article.author %}
                <a href="#" data-bs-toggle="modal" data-bs-target="#myModal">删除文章</a>
                <!-- 新增一个隐藏的表单 -->
                <form
                        style="display:none;"
                        id="safe_delete"
                        action="{% url "delete" article.id %}"
                        method="POST"
                >
                    {% csrf_token %}
                    <button type="submit">发送</button>
                </form>
                &nbsp
                <a href="{% url "update" article.id %}">编辑文章</a>
                {% endif %}
               <!-- 增加阅读量和图标 -->
                <small class="col align-self-end" style="color: gray;">
                            <span class="bi bi-eye">
                            {{ article.total_views }}
                            </span>
                </small>
            </div>
        </div>

以上代码我们在编辑文章后面增加了阅读量和图标,效果如下:

热度和时间排序

增加了浏览量字段后,我们继续实现排序功能。

修改视图

我们的排序功能主要是在列表页面,所以我们重新编写下article_list视图:

def article_list(request):
    # 根据GET请求中查询条件
    # 返回不同排序的对象数组
    if request.GET.get('order') == 'total_views':
        article_list = Article.objects.all().order_by('-total_views')
        order = 'total_views'
    else:
        article_list = Article.objects.all().order_by('created')
        order = 'created'

    paginator = Paginator(article_list, 2)
    page = request.GET.get('page')
    articles = paginator.get_page(page)

    # 修改此行
    context = { 'articles': articles, 'order': order }

    return render(request, 'article/list.html', context)

视图函数关键代码解释如下:

  • Get请求中,我们增加一个传递参数order,视图里面根据请求的参数不同对取出的文章对象按不同的字段进行排序。
  • 这里我们只有两个排序选项,按浏览量和按创建日期,默认是按创建日期。
  • order_by('-total_views')order_by()是排序方法,这里我们通过在整形字段前面加上负号,代表我们根据字段逆序排序(只有带符号字段可以如此操作)。
  • context = { 'articles': articles, 'order': order },这里我们传递参数的时候将order也一起传了,因为我们会有分页的动作,分页的时候不需要重新点击排序按钮了,需要指定当前的排序方法。

修改模板

接着修改列表模板,需要修改两个地方:

第一处我们在列表最上方增加两个排序选项,这里我们使用了Bootstrap的面包屑导航组件

<!-- 写入 base.html 中定义的 content -->
{% block content %}
<!-- 定义放置文章标题的div容器 -->
 <br>
<div class="container">
    <nav aria-label="breadcrumb">
        <ol class="breadcrumb">
            <li class="breadcrumb-item">
                <a href="{% url 'list' %}">
                    最新
                </a>
            </li>
            <li class="breadcrumb-item">
                <a href="{% url 'list' %}?order=total_views">
                    最热
                </a>
            </li>
        </ol>
    </nav>

效果如下:

接着我们把分页的跳转链接也增加上order参数:

<div class="pagination row">
    <div class="m-auto">
        <span class="step-links">
            <!-- 如果不是第一页,则显示上翻按钮 -->
            {% if articles.has_previous %}
                <a href="?page=1&order={{ order }}" class="btn btn-success">
                    &laquo; 1
                </a>
                <span>...</span>
                <a href="?page={{ articles.previous_page_number }}&order={{ order }}"
                   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 }}"
                    class="btn btn-secondary">{{ articles.next_page_number }}</a>
                <span>...</span>
                <a href="?page={{ articles.paginator.num_pages }}&order={{ order }}"
                    class="btn btn-success">{{ articles.paginator.num_pages }} &raquo;</a>
            {% endif %}
        </span>
    </div>
</div>

结语

本篇我们增加了统计浏览量的功能,同时在此基础上,增加了博文列表排序的功能,可以根据最新或者最热来对文文章进行排序。

另外,我们引入了眼睛图标,来生动的展示阅读量效果。

下篇我们将实现博客网站的最后一个核心功能:搜索。

python+Django+pycharm+mysql 搭建首个web项目详解
09-09
主要介绍了python+Django+pycharm+mysql 搭建首个web项目,结合实例形式详细分析了python+Django+pycharm+mysql搭建web项目的具体步骤与相关操作技巧,需要的朋友可以参考下
python+django+mysql电影推荐系统源码,毕业设计.zip
05-03
python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系统源码,毕业设计 python+django+mysql电影推荐系
基于python框架django实现的个人博客管理系统包含前端+后台
06-29
基于python框架django实现的个人博客管理系统包含前端+后台 运行环境 django1.10+python3+sublime text3+Navicat Premium+cmd命令 项目技术 django+python+sql+cmd+html+css+jquery 使用分页插件,jquery实现万年历,实现时间自动同步更新,调用QQAPI会话面板,前后端分离,后台对数据的增删查改,对用户增删查改,对用户权限赋予等等。 数据库文件sqlite文件—db.sqlite3,数据库名dfyblog 账户密码: admin+password123
django_rest_framework之GenericAPIView(二)之搜索、排序、分页讲解
python全栈
08-09 550
一、搜索过滤的步骤 1、在全局配置文件settings.py中设置’DEFAULT_FILTER_BACKENDS’,‘DEFAULT_FILTER_BACKENDS’指定使用的过滤搜索引擎类路径(SearchFilter为搜索引擎类) 2、在继承了GenericAPIView的类视图中,search_fields类属性指定模型类中需要进行搜索过滤的字段名 3、利用postman进行搜索查询 4、如果我想改变搜索关键字search,怎么改? 直接将rest_framework\settings.py文
手把手带你学会Django2.0框架
12-07
本课程是基于Python3.8和Django2.1.5框架进行讲解,主要内容有:1、模型模块学习内容大概是:模型分析、模型创建、模型迁移、模型查询等操作2、视图模块学习内容大概是:Request、Response、Cookie、Session等3、模板学习学习内容大概是:模板语言、过滤器、转义等4、其他常用模块学习内容大概是:富文本、分页、全文检索、缓存、管理后台、中间件等5、项目个人博客内容大概是:轮播图、首页文章、**评论文章、评论、登录注册、标签、分类等6、部署内容大概是:uWSGI、Nginx7、安全内容大概是:CSRF、XSS、点击劫持、SQL注入等
Python-django搭建博客
08-12
django搭建博客
django 快速搭建blog
xyjikl
11-03 431
Django 自称是“最适合开发有限期的完美WEB框架”。本文参考《Django web开发指南》,快速搭建一个blog 出来,在中间涉及诸多知识点,这里不会详细说明,如果你是第一次接触Django ,本文会让你在感性上对Django有个认识,完成本文操作后会让你有兴趣阅读的相关书籍和文档。 废话少说,come on!! 本操作的环境: ===================
python+django 博客
学习笔记
04-24 331
环境: python 27      Django1.8.14 一 到安装目录下,创建工程: 输入django-admin.py startproject mysite 在工程下创建blog应用  python manage.py startapp blog 初始化数据库 :python manage.py syncdb (如果提示无法识别该命令,是因为django版本不对,用imgra
python Django 搭建博客
_feiji的博客
08-26 172
创建项目 django-admin startproject 项目名 创建应用 python manage.py startapp 应用名 在 settings.py 文件 INSTALLED_APPS 里添加app
python django博客_使用Django搭建个人博客网站
weixin_39716703的博客
12-04 146
创建项目首先要在命令行创建Django项目:$ django-admin startproject my_blog初始化设置在my_blog/my_blog/setting.py中修改下面几个选项:添加等待要创建的应用:创建应用现在来创建博客应用进入刚刚创建的my_blog项目后执行:$ python manage.py startapp blog可以看到已经创建了blog应用创建模型与数据库使用...
Python使用Django实现博客系统完整版
12-24
今天花了一些时间搭了一个博客系统,虽然并没有相关于界面的美化,但是发布是没问题的。 开发环境 操作系统:windows 7 64位 Django: 1.96 Python:2.7.11 IDE: PyCharm 2016.1 功能篇 既然是博客系统,发布的自然是博客了。让我们想想,一篇博客有什么属性。所以我们要有能添加博客,删除博客,修改博客,以及给博客发评论,贴标签,划分类等功能。 关系分析 属性 博客:标题,内容。 标签:标签名 分类:分类的名称 评论:评论人,评论人email,评论内容 关系 博客:一篇博客可以有多个标签,多个评论,属于一个分类 标签:一类标签可以赋
Python基于Django3.0的个人博客系统源码.zip
05-18
Python基于Django3.0的个人博客系统源码.zip
基于Python+Django+MySQL的个人博客系统源码+全部数据(毕业设计).zip
11-13
基于Python+Django+MySQL的个人博客系统源码+全部数据(毕业设计).zip 已获导师指导并通过的高分项目。可作为毕业设计、课程设计、期末大作业等。 基于Python+Django+MySQL的个人博客系统源码+全部数据(毕业设计...
Python + Django4 +MySQL搭建个人博客源码
05-31
服务端:Python 3.9 Web框架:Django 4.10 数据库:MySQL mysql-8.0.13-winx64 开发工具IDE:Pycharm(社区版) 前端框架:Bootstrap 5 博客网站,主要包含如下几个功能模块: 1、登录页面: 其中需要登录,校验,...
基于python3.7+django3.0+simpleui搭建的简易个人博客系统源码.zip
05-08
基于python3.7+django3.0+simpleui搭建的简易个人博客系统,适合入门学习~ 基于python3.7+django3.0+simpleui搭建的简易个人博客系统,适合入门学习~ 基于python3.7+django3.0+simpleui搭建的简易个人博客系统,...
mysql查询置顶信息,并按照时间排序
a1011259215的博客
07-07 758
今天有个需求是设置信息置顶,并且置顶信息为多个是置顶信息按照时间排序,不置顶信息也按照时间排序,但是置顶信息优先显示 然后就在数据库加了一个置顶的字段top_flag 然后用sql多排序实现 SELECT * FROM `cms_article` order by top_flag desc,create_time desc ...
Django排序方法详解介绍
qq_43520820的博客
06-29 7751
Django的各种排序方法 今天在公司遇到一个给通知公告置顶的需求,我就学习了一下Django如何进行排序 1、如何以升序或者降序方式给查询及排序 通过order_by方法实现,需要传入待排序的字段,查询语句如下 User.objects.all().order_by('pk') # 升序,即从小到大 User.objects.all().order_by('-pk') # 降序,即从大到小 # 你可以传入多个字段给order_by方法 User.objects.all().order_by('pk'
PythonDjango框架开发博客
chou_out_man的博客
07-19 442
先来一张目录结构图 1、第一步,必然是向创建目录啦!   ,打开命令行,进入想要安置项目的目录 命令行输入: django-admin  startproject myblog 1、博客系统初始界面 ,显示文章列表和添加新文章按钮 博客 添加新文章 {% for article in articles %} {{ article.id
pythondjango博客系统_Python采用Django开发自己的博客系统
weixin_29515317的博客
02-10 428
好久之前就想做一下自己的博客系统了,但是在网上查了查好像是需要会一些Node.js的相关知识,而且还要安装辣么多的库什么的,就不想碰了。但是我遇到了Django这么一款神器,没想到我的博客系统就这么建立起来了。虽然是最基础的类型。但是也算是成功了,这篇博客比较适合对Django有了一定了解的童鞋,如果是新手的话,建议先看一下django的基础知识点再来做实验,这样效率更高!好了,话不多说,开始吧。...
python+django+vue搭建考试系统
最新发布
02-07
考试系统是一个用于管理考试内容,考试安排和学生成绩的学术管理系统。使用PythonDjango框架和Vue.js框架可以搭建一个功能强大的考试系统。 首先,使用PythonDjango框架可以快速构建后端服务,包括用户管理、考试安排、题目管理、成绩统计等功能。Django具有快速开发、强大的数据库操作和丰富的扩展插件,非常适合构建这样的复杂系统。同时,Django的安全特性也可以确保考试系统的数据安全。 其次,使用Vue.js框架可以构建动态的前端界面,使用户可以更加直观地操作考试系统。Vue.js的数据绑定和组件化开发,能够有效地提高页面渲染速度和用户体验。通过Vue.js,可以构建考试安排预览、题目查看、成绩查询等功能模块,使用户操作更加便捷。 在搭建考试系统时,可以利用Django的REST framework构建后端API接口,并使用Vue.js进行前后端分离的开发方式。通过RESTful API,可以实现前后端的无缝交互,使系统更加灵活和高效。 总之,使用PythonDjango框架和Vue.js框架搭建考试系统,可以实现功能全面、界面友好、操作高效的系统。同时,使用这两大框架可以有效提高开发效率,减少系统维护成本。通过合理的设计和技术选型,可以构建一个稳定、安全、高效的考试系统,满足教育机构和学生的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 学生信息管理系统(Python)完整版 31521
  • 利用Python+Django快速开发Web毕业设计 29120
  • 中国MES市场主流厂商及产品分析 21937
  • [Python+Django]Web图书管理系统毕业设计之数据库及系统实现源码篇 20296
  • 2023最新大数据毕业设计论文题目(117篇) 15669

分类专栏

  • Python Web 17篇
  • Python Web毕业设计 21篇
  • Django全栈开发 17篇
  • 《Python程序设计案例教程》-课后习题答案 5篇
  • 数据库课程设计 2篇
  • AI 1篇
  • Python作业项目合集 9篇
  • 【零基础Python Web实战】停车场管理系统 1篇
  • Python数据可视化分析 2篇
  • Python数据结构实验 1篇
  • Python+Django4 搭建个人博客 20篇
  • 前端小技巧 1篇
  • Django 进销存管理系统
  • Python Excel自动化 1篇
  • 开源脑洞 1篇
  • Python实例 1篇
  • 智能制造&工业4.0 1篇
  • MES 1篇
  • SAP-MM问题集锦 2篇
  • SAPMM 4篇
  • SAPPP 8篇
  • SAP 业务顾问成长之路 4篇
  • SAP技巧集 5篇
  • SAP FI
  • SAP ABAP实例大全 5篇
  • 企业信息化 5篇
  • SAP实施攻略 7篇
  • SAP ABAP 18篇
  • SAP WM 11篇

最新评论

  • Django中利用Admin后台实现Excel/CSV的导入更新数据库和导出数据到Excel/CSV

    huhug002: 我已经实现,谢谢

  • Django中利用Admin后台实现Excel/CSV的导入更新数据库和导出数据到Excel/CSV

    huhug002: 如果这里的model已经在其他管理页面注册过了,比如我有一个bookadmin的管理页,模型book已经注册到了这个bookadmin,里面可以手动进行数据的录入,我想在这个页面上再加一个导入导出的功能,怎么实现

  • Python + Django4 搭建个人博客(十二):实现删除文章功能页面

    随小风: 请问下载的bootstrap文件应该放在哪个目录下

  • 《Python程序设计案例教程》-课后习题答案第6章

    CSDN-Ada助手: 推荐 Python入门 技能树:https://edu.csdn.net/skill/python?utm_source=AI_act_python

  • 手把手带你基于Python+Django+百度云实现车牌识别

    李威威wiwi: https://download.csdn.net/download/agelee/88886948

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 基于Python Web的在线考试管理系统毕设之需求分析和数据库设计篇
  • [Python+Django]一个简单基于协同过滤算法的电影推荐系统的设计和实现
  • Python和Django的基于协同过滤算法的电影推荐系统源码及使用手册
2024年14篇
2023年24篇
2022年30篇
2021年21篇
2020年13篇
2019年26篇
2018年5篇
2017年1篇
2016年3篇

目录

目录

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李威威wiwi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司南阳seo哪家好福州品牌网站设计推荐垦利网站推广工具多少钱天水模板网站建设多少钱百色百姓网标王楚雄网站制作设计张家界网站建设报价朔州网站推广多少钱黔西南网站推广方案抚顺网页设计巴中建站丽水企业网站改版苏州模板推广海东网站优化按天收费哪家好日照英文网站建设公司毕节设计公司网站报价朝阳关键词按天扣费报价昆明网站搜索优化哪家好吉林网站排名优化报价日照百度爱采购公司江门网站制作推荐大理关键词排名包年推广多少钱洛阳网页制作多少钱鞍山网站推广工具价格泰州seo优化哪家好黑河网站推广方案价格呼和浩特百度标王价格西宁百度关键词包年推广多少钱盐城建站价格龙岩网站优化多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化