作者:HelloGitHub-追梦人物

文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库

在之前的系列教程中,我们已经实现了:文章的发布、展示、评论等功能,可能认真的小伙伴已经发现这些功能有一些地方设计的不是很好,今天我们就来优化一些体验和操作上的细节。让我们的博客更加完美,使用起来更加顺手~

在模型中指定排序

为了让文章(Post)按发布时间逆序排列,让最新发表的文章排在文章列表的最前面,我们对返回的文章列表进行了排序,即各个视图函数中都有类似于 Post.objects.all().order_by('-created_time') 这样的代码,导致了很多重复。因为只要是返回的文章列表,基本都是逆序排列的,所以可以在 Post 模型中指定 Post 的自然排序方式。

django 允许我们在 models.Model 的子类里定义一个名为 Meta 的内部类,通过这个内部类指定一些属性的值来规定这个模型类该有的一些特性,例如在这里我们要指定 Post 的排序方式。首先看到 Post 的代码,在 Post 模型的内部定义的 Meta 类中,指定排序属性 ordering

blog/models.py

class Post(models.Model):
...
created_time = models.DateTimeField()
... class Meta:
verbose_name = '文章'
verbose_name_plural = verbose_name
ordering = ['-created_time']

ordering 属性用来指定文章排序方式,['-created_time'] 指定了依据哪个属性的值进行排序,这里指定为按照文章发布时间排序,且负号表示逆序排列。列表中可以有多个项,比如 ordering = ['-created_time', 'title'] 表示首先依据 created_time 排序,如果 created_time 相同,则再依据 title 排序。这样指定以后所有返回的文章列表都会自动按照 Meta 中指定的顺序排序,因此可以删掉视图函数中对文章列表中返回结果进行排序的代码了。

评论的模型类(Comment)也可以添加这个属性。

完善跳转链接

导航栏有一个 Black & White 的 Logo,我们希望点击它就能回到首页面,只需修改一下超链接即可。打开 base.html,修改 Logo 处的超链接:

<header id="site-header">
<div class="row">
<div class="logo">
<h1><a href="{% url 'blog:index' %}"><b>Black</b> &amp; White</a></h1>
</div>
...
</div>
</header>

另外导航栏还有一个首页导航按钮,也希望点击它就能回到首页面,修改的任务作为练习交给你了(有两处,一处是桌面端导航,另一处是移动端导航)。

当然还有一些跳转可以完善,比如文章标题下有分类、发布时间、作者、评论量、阅读量等信息,可以设置点击分类跳转到分类页面;点击阅读量就跳转到文章详情页等,这些细节部分不涉及新知识,就当做练习交给你自己完成了。

显示正确的评论量

有两处地方显示的评论量(首页文章列表和文章详情页),显示评论量的方法很简单。回顾一下我们是如何获取某篇文章下的评论列表的?我们使用的是 post.comment_set.all()all 方法返回该 post 关联的评论列表。此外模型管理器(comment_set 是一个特殊的模型管理器)还有一个 count 方法,返回的是数量,即 post 下有多少条评论,我们可以直接在模板中调用这个方法:{{ post.comment_set.count }}。将评论量替换成该模板变量就可以正确显示文章的评论数了。

跳转评论区域

有时候文章内容长了,评论列表的内容就需要滚动很长的页面才能看到。我们可以在评论区域增加一个锚点,2 处显示评论量的地方超链接都指向这个锚点处,这样点击这两个地方将直接跳转到评论列表区域,方便用户快速查看评论内容。

看到显示评论的模板代码:

<section class="comment-area" id="comment-area">
<hr>
<h3>发表评论</h3>
...
</section>

我们已经给评论区域的标签设置了 id,只需要在评论的链接后加上这个 id 的锚点即可:

blog/index.html

<div class="entry-meta">
...
<span class="comments-link"><a href="{{ post.get_absolute_url }}#comment-area">{{ post.comment_set.count }} 评论</a></span>
<span class="views-count"><a href="#">588 阅读</a></span>
</div>
blog/detail.html

<header class="entry-header">
<h1 class="entry-title">{{ post.title }}</h1>
...
<span class="comments-link"><a href="#comment-area">{{ post.comment_set.count }} 评论</a></span>
<span class="views-count"><a href="#">588 阅读</a></span>
</div>
</header>

注意这里从 index.html 到评论区域需要跳转页面,因此 href 超链接指定为绝对 URL,而文章详情和评论区域在一个页面,因此仅需指定锚点即可。

结束了么

我们通过一个博客实战项目,了解了 django 基本的开发技术。包括如何编写模型(Model)、如何编写视图函数(View)、如何使用 django 内置的模板系统(Template)以及如何配置路由(URL),这四大模块是 django 开发的核心所在,现在我们已经能够基本掌握这些模块的使用方法了。

但是,还没完...

Django 提供的不仅仅是这些,我们的博客也不仅仅只有这些功能。如何对博客文章进行分页?如何给博客提供 RSS 订阅服务?如果实现文章搜索?如果网站需要提供用户系统,如何实现用户的注册登录?如何部署到服务器上让他人通过公网访问?这些需求都可以利用 django 内置的模块或者丰富的第三方应用来实现。

另外,django 还有海量的第三方应用来提供更加丰富的功能。比如当他人评论了我的文章时,如何收到通知提醒?网站需要提供新浪微博、微信等社交账号的登录等等,这些都可以借助 django 第三方应用快速完成,而我们自己只需要写很少量的代码就可以了。

所以,让我们再接再厉,进入到进阶篇,继续学习更多的 django 开发技巧,为博客提供更多的功能吧!


『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎留言联系我们、加入我们,让更多人爱上开源、贡献开源~

第 15 篇:优化博客功能的细节,提升使用体验—— HelloDjango 系列教程的更多相关文章

  1. MWeb 1.4 新功能介绍二:静态博客功能增强

    MWeb 比较有特色的是一键生成静态博客功能,然后从 MWeb 最开始规划要做静态博客生成功能时,我就希望 MWeb 的静态博客生成功能在易用的同时,还要有很强大的扩展性. 比如说能自己增加网站公告, ...

  2. OO第一单元优化博客

    OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)​\)和\(cos(x)​\)的指数作为坐标,在图上画出来就可 ...

  3. 我的第一篇Markdown博客

    我的第一篇Markdown博客 这是我第一次用Markdown写博客,发现还是比较好用的,加上Marsedit也支持了Markdown的博客预览,博客园也加了Markdown的格式支持,就更加方便了, ...

  4. OO第二单元优化博客

    OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...

  5. 第 14 篇:交流的桥梁“评论功能”——HelloDjango 系列教程

    截止到目前为止我们的 django blog 文章展示部分,已经实现的"八九不离十"了.你以为本系列文章就要结束了吗?不能够!新的征程才刚刚开始,HelloDjango 系列文章刚 ...

  6. 五、Abp vNext 基础篇丨博客聚合功能

    介绍 业务篇章先从客户端开始写,另外补充一下我给项目起名的时候没多想起的太随意了,结果后面有些地方命名冲突了需要通过手动using不过问题不大. 开工 应用层 根据第三章分层架构里面讲到的现在我们模型 ...

  7. 利用MetaWeblog API实现XMLRPC写博客功能

    Windows Live Writer是一款小巧的写博客的工具,非常方便,甚至网上看到过有的评论称Live Writer是一款最不像微软产品的微软产品. Writer支持MSN Spaces以及Wor ...

  8. Socket网络编程--FTP客户端(60篇socket博客,而且都比较简单、深入浅出)

    已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解FTP作用 就是一个提供一个文件的共享协议. 1.了解FTP协议 ...

  9. 做个开源博客学习Vite2 + Vue3 (四)实现博客功能

    我们再来看一下管理类的设计. Composition API,就是组合API的意思,那么是不是应该把js代码分离出来,做成独立的管理类的形式呢? 这样代码可以更整洁一些,主要是setup里面的代码就不 ...

随机推荐

  1. Tomcat源码分析 (一)----- 手写一个web服务器

    作为后端开发人员,在实际的工作中我们会非常高频地使用到web服务器.而tomcat作为web服务器领域中举足轻重的一个web框架,又是不能不学习和了解的. tomcat其实是一个web框架,那么其内部 ...

  2. 【数据结构学习】关于HashMap的那些事儿

    涉及数据结构 红黑树 链表 哈希 从CRUD说起 预热知识: DEFAULT_INITIAL_CAPACITY = 1 << 4, HashMap默认容量为16(n << m意 ...

  3. 消息中间件-activemq消息机制和持久化介绍(三)

    前面一节简单学习了activemq的使用,我们知道activemq的使用方式非常简单有如下几个步骤: 创建连接工厂 创建连接 创建会话 创建目的地 创建生产者或消费者 生产或消费消息 关闭生产或消费者 ...

  4. Caddy 源码全解析

    caddy源码全解析 Caddy 源码全解析 Preface Caddy 是 Go 语言构建的轻量配置化服务器.同时代码结构由于 Go 语言的轻便简洁,比较易读,推荐学弟学妹学习 Go 的时候也去查看 ...

  5. Struts1.x 跨站脚本(XSS)漏洞的解决

    一. 演示XSS   当访问一个不存在的网址时,例如[url]http://localhost:8080/demo/noAction.do[/url],那么Struts处理后都会跳到提示“Invali ...

  6. JVM类生命周期概述:加载时机与加载过程

    一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述了类的各种信息,并且它们最终都需要被加载到虚拟机中才能被运行和使用.事实上,虚拟机把描述类的数据从Class文件 ...

  7. 洛谷 P2572 [SCOI2010]序列操作

    题意简述 维护一个序列,支持如下操作 把[a, b]区间内的所有数全变成0 把[a, b]区间内的所有数全变成1 把[a,b]区间内所有的0变成1,所有的1变成0 询问[a, b]区间内总共有多少个1 ...

  8. 洛谷 P1631 序列合并

    题意简述 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个. 题解思路 大根堆,先存入n个和,再比较大小,改变堆中元素. 代码 #include & ...

  9. Top 10 顶级项目管理工具

    成功的项目都要归功于成功的项目管理.这些工具帮你踏上成功之旅! 项目管理是成功完成项目并使公司变得伟大的秘诀.不,这不是标题党(clickbait) -- 我已经看到两家软件公司(我在那里工作)因为项 ...

  10. forward(转发)和redirect(重定向)的区别

    在学习Servlet和JSP时,经常会使用到forward和redirect,我们先来看这两者在Servlet中的调用方式: 1.forward request.getRequestDispatche ...