有了浏览量之后,文章受欢迎的程度就有了评价标准。随之而来的就有根据浏览量对文章进行排序的需求,即显示**“最热文章”**。
现在你已经很熟悉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