• Python + Django4 搭建个人博客(十九):搜索文章


    快速找到想要的文章是用户比较常规的需求,所以文章搜索也是一个博客必要的功能。

    修改视图

    实现搜索的功能,我们继续在article_list的视图中添加功能。

    这里我们查询的时候一般的需求是需要输入某个字符串然后在标题和文章内容中都去匹配。

    这时候我就需要使用到Django中的Q对象了。

    当我们在查询的条件中需要组合条件时(例如两个条件“且”或者“或”)时。我们可以使用Q()查询对象。

    我们可以使用符号&或者|将多个Q()对象组合起来传递给filter(),exclude(),get()等函数。当多个Q()对象组合起来时,Django会自动生成一个新的Q()。例如下面代码就将两个条件组合成了一个

    Q(question__startswith='Who') | Q(question__startswith='What')

    使用上述代码可以使用SQL语句这么理解:

    WHEREquestionLIKE 'Who%' ORquestionLIKE 'What%'

    接着我们来对article_list() 进行改造

    1. def article_list(request):
    2. # 根据GET请求中查询条件
    3. # 返回不同排序的对象数组
    4. search = request.GET.get('search')
    5. order = request.GET.get('order')
    6. # 用户搜索逻辑
    7. if search:
    8. if order == 'total_views':
    9. # 用 Q对象 进行联合搜索
    10. article_list = Article.objects.filter(
    11. Q(title__icontains=search) |
    12. Q(body__icontains=search)
    13. ).order_by('-total_views')
    14. else:
    15. article_list = Article.objects.filter(
    16. Q(title__icontains=search) |
    17. Q(body__icontains=search)
    18. )
    19. else:
    20. # 将 search 参数重置为空
    21. search = ''
    22. if order == 'total_views':
    23. article_list = Article.objects.all().order_by('-total_views')
    24. else:
    25. article_list = Article.objects.all()
    26. paginator = Paginator(article_list, 2)
    27. page = request.GET.get('page')
    28. articles = paginator.get_page(page)
    29. # 修改此行
    30. context = {'articles': articles, 'order': order, 'search': search }
    31. return render(request, 'article/list.html', context)

    主要修订如下:

    • 新增参数search,存放需要搜索的文本。若search不为空,则检索特定文章对象。
    • Q(title__icontains=search)意思是在模型的title字段查询,icontains是不区分大小写的包含,中间用两个下划线隔开。search是需要查询的文本。多个Q对象用管道符|隔开,就达到了联合查询的目的。

    修改模板

    接着改造list模板,要修改的代码比较多,实际上功能上没多大改变,直接贴list.html 的完整代码如下:

    templates/article/list.html

    1. {% extends "base.html" %}
    2. {% load static %}
    3. {% block title %}
    4. 首页
    5. {% endblock title %}
    6. {% block content %}
    7. {#
      #}

    8. class="container">
      1. class="breadcrumb">
    9. class="breadcrumb-item">
  • class="breadcrumb-item">
  • class="row">
  • class="col-auto mr-auto">
  • class="form-inline" >
  • {# #}
  • <input type="text"
  • class="form-control mb-2 mr-sm-2"
  • name="search"
  • placeholder="搜索文章..."
  • required
  • >
  • {% if search %}
  • {% if articles %}
  • "color: red">"{{ search }}"的搜索结果如下:


  • {% else %}
  • 暂无"color: red">"{{ search }}"有关的文章。


  • {% endif %}
  • {% endif %}
  • {% for article in articles %}
  • class="row mt-2">
  • class="col-sm-12">
  • class="card h-100">
  • class="card-body">
  • class="card-title">{{ article.title }}


  • class="card-text">{{ article.body|slice:'100' }}...

  • class="col align-self-end" style="color: gray;">
  • class="bi bi-eye">
  • {{ article.total_views }}
  • {% endfor %}

  • class="pagination row">
  • class="m-auto">
  • class="step-links">
  • {% if articles.has_previous %}
  • ...
  • {% endif %}
  • class="current btn btn-danger btn-lg">
  • {{ articles.number }}
  • {% if articles.has_next %}
  • ...
  • {% endif %}
  • {#
    #}
  • {% endblock content %}
  • 重点改动如下:

    完成后测试效果如下:

    结语

    截止到本篇,我们已经完成了博客文章,评论和用户管理的核心功能,同时也实现了简单的排序和搜索等必要的小功能模块。

    本系列博文的核心模块将告一段落,下篇我们来完成最终的挑战:部署上线。

  • 相关阅读:
    R之广义线性模型
    移动魔百盒CM311-1sa_ZG代工_S905L3A 安卓9.0 鸿蒙动画_线刷固件包
    Leetcode2909. 元素和最小的山形三元组 II
    Vue项目优化方案
    java认证与证书
    MySQL 定时清空某表
    前端工作总结99-关于第二个git仓库提交代码
    AJAX和JSON
    [Git 知识小结]
    Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单
  • 原文地址:https://blog.csdn.net/agelee/article/details/127786796