摘要:有了浏览量之后,文章受欢迎的程度就有了评价标准。随之而来的就有根据浏览量对文章进行排序的需求,即显示最热文章。它也是可以传递多个参数的,如,参数间用隔开视图根据参数的值,判断取出的文章如何排序方法指定对象如何进行排序。
有了浏览量之后,文章受欢迎的程度就有了评价标准。随之而来的就有根据浏览量对文章进行排序的需求,即显示“最热文章”。
现在你已经很熟悉MTV模式,不需要我啰嗦也能完成任务:
文章的模型已经有了,不需要写Model了
写一个视图函数article_list_by_views(),取出按浏览排序后的文章对象
将文章对象传递到模板,并进行渲染
很简单,但也隐藏着问题:最热文章列表和之前的普通文章列表相比,大部分功能其实都是相同的,仅仅是排序不同而已。
万一哪天需要根据文章标题排序呢?万一还需要用户id排序、标签排序、收藏排序...不仅如此,就连路由urls.py都要跟着膨胀。代码会越来越臃肿且不可维护。
重复的代码是万恶之源。因此这里挑战一下,不创建新的视图/路由,而是将排序功能融合到已有的视图/路由中。
视图根据以上需求,重写article_list():
article/views.py ... # 重写文章列表 def article_list(request): # 根据GET请求中查询条件 # 返回不同排序的对象数组 if request.GET.get("order") == "total_views": article_list = ArticlePost.objects.all().order_by("-total_views") order = "total_views" else: article_list = ArticlePost.objects.all() order = "normal" paginator = Paginator(article_list, 3) page = request.GET.get("page") articles = paginator.get_page(page) # 修改此行 context = { "articles": articles, "order": order } return render(request, "article/list.html", context)
重点知识如下:
前面用过GET请求传递单个参数。它也是可以传递多个参数的,如?a=1&b=2,参数间用&隔开
视图根据GET参数order的值,判断取出的文章如何排序
order_by()方法指定对象如何进行排序。模型中有total_views这个整数字段,因此‘total_views’为正序,‘-total_views’为逆序
为什么把新变量order也传递到模板中?因为文章需要翻页!order给模板一个标识,提醒模板下一页应该如何排序
这样一来,排序所需要的参数都可以通过查询获得,连urls.py都不用改写了。
模板接下来修改文章列表模板:优化入口,并且正确分页:
templates/article/list.html ...{% for article in articles %} ... {% endfor %}... « 1 ... ... ... {% if articles.has_next %} {{ articles.next_page_number }} ... {{ articles.paginator.num_pages }} » ...新增了Bootstrap中的面包屑导航样式breadcrumb
页码导航中,所有的分页链接都新增了order参数
测试启动服务器,点击“最热”:
工作得很好!切换页码,留意地址栏中是如何变化的。
还剩一个小瑕疵:用户点击“最热”按钮后,此按钮最好能够变为灰色,并且不可点击。这个精益求精的机会就留给读者去优化吧。
header.html中有一个小改动:"写文章"的入口被挪到用户下拉菜单中了。总结本章已经摸到一个高级的编程领域门槛了:代码复用。将类似功能的代码合并到了一起,并且让后续的功能扩展变得很容易。只需要在视图中写几个elif语句就搞定了。
在读者以后的编程中,也要尽量优化代码结构,达到事半功倍的效果。
至此,博客虽小,功能却相当完整了。继续努力!
有疑问请在杜赛的个人网站留言,我会尽快回复。
或Email私信我:dusaiphoto@foxmail.com
项目完整代码:Django_blog_tutorial
转载请注明出处。文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/42918.html
摘要:更酷的是,我们希望搜索出来的文章也能够按照时间热度等各种方式进行排序。若不为空,则检索特定文章对象。总结本章完成了一个简单的搜索功能,这对于个人博客来说应该够用了。 不管是最新文章列表也好、最热文章列表也罢,都是把所有的文章数据全部展示给了用户。 但是如果用户只关心某些特定类型的文章,抽取全部数据就显得既不方便、又不效率了。 因此,给用户提供一个搜索功能,提供给用户感兴趣的几篇文章,就...
摘要:而文章分类一个重要的途径就是设置栏目。修改文件栏目的栏目标题创建时间文章栏目的一对多外键栏目的有两个字段,名称和创建日期。修改文章的栏目功能,也就完成了。对个人博客来说,栏目数据的变动通常是很少的。 博客的文章类型通常不止一种:有时候你会写高深莫测的技术文章,有时候又纯粹只记录一下当天的心情。 因此对文章的分类就显得相当的重要了,既方便博主对文章进行分类归档,也方便用户有针对性的阅读。...
摘要:每一篇文章的标签可能都不一样,并且还可能拥有多个标签,这是与栏目功能不同的。列表中显示标签虽然保存标签的功能已经实现了,还得把它显示出来才行。更多的用法请阅读官方文档总结本章学习了使用来完成标签功能。 标签是作者从文章中提取的核心词汇,其他用户可以通过标签快速了解文章的关注点。每一篇文章的标签可能都不一样,并且还可能拥有多个标签,这是与栏目功能不同的。 好在标签功能也有优秀的三方库:D...
摘要:文章浏览量是所有社交类网站所必备的数据,足以显示其重要性了。总结本章完成了简单的统计浏览量的功能,并且在前后端中对用户的身份进行了验证。下一章学习与浏览量紧密相关的功能查询最热文章。 文章浏览量是所有社交类网站所必备的数据,足以显示其重要性了。 博主可以通过浏览量来评估某篇文章的受欢迎程度,读者也能够通过浏览量来筛选质量更高的文章。 然而,准确统计浏览量并不简单: 某些类型的请求不应...
摘要:在里写一个数据库驱动的应用的第一步是定义模型,也就是数据库结构设计和附加的其它元数据。模型元数据是任何不是字段的东西,例如排序选项数据库表名单数和复数名称和。 Django 框架主要关注的是模型(Model)、模板(Template)和视图(Views),称为MTV模式。 它们各自的职责如下: 层次 职责 模型(Model),即数据存取层 处理与数据相关的所有事务: 如何存取...
阅读 1265·2021-09-22 15:00
阅读 3294·2019-08-30 14:00
阅读 1206·2019-08-29 17:27
阅读 1210·2019-08-29 16:35
阅读 668·2019-08-29 16:14
阅读 2022·2019-08-26 13:43
阅读 2059·2019-08-26 11:35
阅读 2297·2019-08-23 15:34