作者: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 处的超链接:
...
另外导航栏还有一个首页导航按钮,也希望点击它就能回到首页面,修改的任务作为练习交给你了(有两处,一处是桌面端导航,另一处是移动端导航)。
当然还有一些跳转可以完善,比如文章标题下有分类、发布时间、作者、评论量、阅读量等信息,可以设置点击分类跳转到分类页面;点击阅读量就跳转到文章详情页等,这些细节部分不涉及新知识,就当做练习交给你自己完成了。
显示正确的评论量
有两处地方显示的评论量(首页文章列表和文章详情页),显示评论量的方法很简单。回顾一下我们是如何获取某篇文章下的评论列表的?我们使用的是 post.comment_set.all()
。all
方法返回该 post
关联的评论列表。此外模型管理器(comment_set
是一个特殊的模型管理器)还有一个 count
方法,返回的是数量,即 post
下有多少条评论,我们可以直接在模板中调用这个方法:{{ post.comment_set.count }}
。将评论量替换成该模板变量就可以正确显示文章的评论数了。
跳转评论区域
有时候文章内容长了,评论列表的内容就需要滚动很长的页面才能看到。我们可以在评论区域增加一个锚点,2 处显示评论量的地方超链接都指向这个锚点处,这样点击这两个地方将直接跳转到评论列表区域,方便用户快速查看评论内容。
看到显示评论的模板代码:
我们已经给评论区域的标签设置了 id,只需要在评论的链接后加上这个 id 的锚点即可:
blog/index.html
blog/detail.html
{{ post.title }}
...
{{ post.comment_set.count }} 评论
588 阅读
发表评论
...