Django搭建个人博客:简单搜索博客文章

本文介绍了如何在Django项目中添加搜索功能,允许用户按照时间、热度等条件搜索文章。通过GET请求提交搜索文本,使用Q对象进行联合查询,过滤出匹配的博客条目。在模板中增加搜索栏并优化相关组件,确保翻页和排序功能正常。测试结果显示,搜索功能成功实现了忽略大小写的关键词检索。最后,鼓励读者探索更多实现搜索功能的方法。
摘要由CSDN通过智能技术生成

不管是最新文章列表也好、最热文章列表也罢,都是把所有的文章数据全部展示给了用户。

但是如果用户只关心某些特定类型的文章,抽取全部数据就显得既不方便、又不效率了。

因此,给用户提供一个搜索功能,提供给用户感兴趣的几篇文章,就大有用处了。

准备工作

逻辑

尽管细节不同,但是搜索和列表有很多类似的地方:它们都是先检索出一些文章对象,并将其展示给用户。上一章已经说过,代码重复是万恶之源,好的实践必须把功能类似的模块尽量复用起来。基于这个原则,我们打算继续在原有的article_list()上添砖加瓦,让其功能更加的强大。

随着项目越来越庞大,又需要将功能复杂的模块拆分成更简单的多个模块。目前我们还不用担心这个问题。

更酷的是,我们希望搜索出来的文章也能够按照时间、热度等各种方式进行排序。因此需要构造一个新的参数search,能够和之前的order参数进行联合查询。

GET还是POST?

用户搜索内容时提交的文本,可以用GET请求提交,也可以用POST请求提交。根据实际的需要进行选择。

因为order是用GET提交的,并且翻页是GET请求,因此选择GET方式提交搜索文本,可以方便地和之前的模块结合起来。

之前我们已经用过表单组件<form method="POST">,通过POST请求提交数据。表单组件同样也可以提交GET请求,只要去掉method="POST"属性就可以了。

Q对象

Model.objects.all()能够返回表中的所有对象。

对应的,Model.objects.filter(**kwargs)可以返回与给定参数匹配的部分对象。

还有Model.objects.exclude(**kwargs)返回与给定参数不匹配的对象

如果想对多个参数进行查询怎么办?比如同时查询文章标题和正文内容。这时候就需要Q对象

视图

那么按照前面说好的,修改article_list()

article/views.py

...

# 引入 Q 对象
from django.db.models import Q

def article_list(request):
    search = request.GET.get('search')
    order = request.GET.get('order')
    # 用户搜索逻辑
    if search:
        if order == 'total_views':
            # 用 Q对象 进行联合搜索
            article_list = ArticlePost.objects.filter(
                Q(title__icontains=search) |
                Q(body__icontains=search)
            ).order_by('-total_views')
        else:
            article_list = ArticlePost.objects.filter(
                Q(title__icontains=search) |
                Q(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值