最新消息:欢迎光临 魔力 • Python!大家可以点开导航菜单中的【学习目录】,这个目录类似图书目录,更加方便学习!

Django2练习项目:开发个人博客系统(7)

Django教程 小楼一夜听春语 6200浏览 0评论

这篇教程我们一起来完成Django2个人博客系统搜索结果页相关代码的编写。

搜索栏功能在模板“sidebar.html”中,在之前的教程中我们已经完成。

结合前面的教程,我们知道搜索的路径是“search/”,并且通过“GET”方法,将输入框“key”的值进行传递。

在视图中,我们就需要根据“key”的值获取搜索结果。

那么,我们通过关键词搜索时,往往是需要进行模糊搜索。

这里,我们要实现将标题或内容中包含关键词的文章查询出来。

另外,还有一点需要实现,就是在搜索结果页的搜索框中要保留关键字。

示例代码:

from django.db.models import Q  # 帮助完成查询条件设置
class Search(ListView):
    model = Article
    template_name = 'search.html'
    paginate_by = 5

    def get_queryset(self):
        key = self.request.GET['key']  # 获取查询关键字
        if key:
            return Article.objects.filter(Q(title__icontains=key) | Q(content__icontains=key)).order_by('-id')
            # 查询标题或者内容包含关键字的数据对象
        else:
            return None

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['key'] = self.request.GET['key']  # 获取关键字存入传入模板的数据中
        return context

然后,我们进行URL设置。

示例代码:

path('search/', blog_view.Search.as_view(), name='search'),

最后,定义搜索结果页面的模板内容。

依然可以从首页模板复制内容进行增加。

提示:其实大部分相同的页面结构,也可单独为这些页面创建父级模板,以便减少模板中的代码量。

示例代码:(search.html)

{% extends 'base.html' %}
{% block title %}搜索结果{% endblock %}
{% block content %}
    <h4> 以下是【{{ key }}】的查询结果:</h4>
    {% for article in object_list %}
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title">
                    <a href="{% url 'detail' article.id %}">{{ article.title }}</a>
                </h3>
            </div>
            <div class="panel-body">
                <p>作者:{{ article.author }} 日期:{{ article.pub_time }}</p>
                <p>{{ article.content|truncatechars:200|striptags }}</p>
                <a class="btn" href="{% url 'detail' article.id %}">进入阅读 »</a>
            </div>
        </div>
    {% empty %}
        <h4> 没有查询结果!</h4>
    {% endfor %}
        <!--分页条-->
    {% include 'paginator.html' %}
{% endblock %}

到这里,我们就可以正常使用搜索功能了。

转载请注明:魔力Python » Django2练习项目:开发个人博客系统(7)

头像
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网站 (可选)

网友最新评论 (3)

  1. 头像
    {% for article in object_list %} 搜索结果页也可能会多于5个,这里是不是应该用page_obj啊?
    小新6年前 (2019-01-15)回复
    • 小楼一夜听春语
      我觉得是你的视图函数有问题
      小楼一夜听春语6年前 (2019-01-24)回复
  2. 头像
    没有输入搜索关键字点击按钮会报错,TypeError at /search/ object of type 'NoneType' has no len() Request Method: GET Request URL: http://127.0.0.1:8000/search/?key= Django Version: 2.1.7 Exception Type: TypeError Exception Value: object of type 'NoneType' has no len()
    北国江城6年前 (2019-02-26)回复