博客五部曲之一 - 简单博客


1453 浏览 5 years, 11 months

37 搜索

版权声明: 转载请注明出处 http://www.codingsoho.com/

首先,在列表页面添加一个搜索框

<form method="GET" action="">
    <input type="text" name="q" placeholder="Search posts" value="{{request.GET.q}}" />
    <input type="submit" value="Search" />                
</form>

搜索框放在一个form里,提交的方式是GET
输入框 name=”q”,当用户提交时输入框的内容会作为字典q的值提交,URL形式为?q=,视图可以通过request.GET.get(“q”)获取。
Value=”{{request.GET.q}}”是将搜索的内容回显到输入框。

在视图函数post_list里面添加对搜索内容的过滤,下面代码中搜索标题里是否含有对应的内容

def post_list(request):
    queryset_list = Post.objects.active()
    if request.user.is_staff or request.user.is_superuser:
        queryset_list = Post.objects.all()
    query = request.GET.get("q")
    if query:
        queryset_list = queryset_list.filter(title__icontains=query)

但是有的时候,需要对多个字段进行搜索,这就需要用到Django的另一个库Q了
https://docs.djangoproject.com/en/1.11/topics/db/queries/#complex-lookups-with-q-objects

from django.db.models  import Q

def post_list(request):
    query = request.GET.get("q")
    if query:
        queryset_list = queryset_list.filter(
            Q(title__icontains=query) |
            Q(content__icontains=query) | 
            Q(user__first_name__icontains=query) |
            Q(user__last_name__icontains=query)
            ).distinct()

注意修改翻页的模板以兼容q查询,URL里面添加q参数

<div class="pagination">
    <span class="step-links">
        {% if object_list.has_previous %}
            <a href="?{{page_var}}={{ object_list.previous_page_number }}{% if request.GET.q %}&q={{request.GET.q}}{% endif %}">previous</a>
        {% endif %}
        <span class="current">
            Page {{ object_list.number }} of {{ object_list.paginator.num_pages }}.
        </span>
        {% if object_list.has_next %}
            <a href="?{{page_var}}={{ object_list.next_page_number }}{% if request.GET.q %}&q={{request.GET.q}}{% endif %}">next</a>
        {% endif %}
    </span>
</div>