【Django】列表页面的搜索功能

目的

页面列表增加多字段搜索显示查询结果

方案

分页显示搜索结果

效果

在这里插入图片描述

实现

列表页面

# list.html
<div class="pull-left"  style="margin-bottom: 10px">
    <form action="{% url 'api-search' %}" method="get">
        <div class="col-sm-3">
            <input class="form-control" name="path" placeholder="path" type="search">
        </div>
        <div class="col-sm-3" >
            <input class="form-control" name="reqcode" placeholder="reqcode" type="search">
        </div>
        <div class="col-sm-3">
            <input class="form-control" name="project_name" placeholder="project_name" type="search">
        </div>
        <span class="input-group-btn">
            <button class="btn btn-primary" type="submit">搜索</button>
        </span>
    </form>
</div>

查询结果分页

# pagintion.html
<div class="container" id="nav" style="text-align:center;">
    <ul class="pagination" id="page" >
        <li>共{{ paginator.num_pages }}页/第{{page.number}}页 跳转到第
            <input id="pageNum" size="1" style="width: 50px" type="number" value="{{ current_page }}"><button class="btn btn-default btn-sm" onclick="getPage();">跳转</button>
        </li>

        {% if page.has_previous %}
            <li class="previous"><a href="{{ request.path }}?{{mywhere|join:'&'}}&page={{ page.previous_page_number }}">上一页</a></li>
        {% else %}
            <li class="previous disabled"><a href="#">上一页</a></li>
        {% endif %}
        {% for num in page_range %}
            {% if num == current_page %}
            <li class="active" ><a href="{{ request.path }}?{{mywhere|join:'&'}}&page={{ num }}">{{ num }}</a></li>
            {% else %}
            <li class="item"><a href="{{ request.path}}?{{mywhere|join:'&'}}&page={{ num }}">{{ num }}</a></li>
            {% endif %}
        {% endfor %}
        {% if page.has_next %}
            <li class="next"><a href="{{ request.path}}?{{mywhere|join:'&'}}&page={{ page.next_page_number }}">下一页</a></li>
        {% endif %}
    </ul>
</div>

<script type="text/javascript">
    function getPage() {
        var num = $('#pageNum').val();
        if(num<=0 || num>{{ paginator.num_pages }}){
            alert('请输入1-{{paginator.num_pages}}');
        }else{
            window.location.href='{{ request.path}}?{{mywhere|join:'&'}}&page='+num;
        }
    }
</script>

视图

def get_api_list(request,filter:dict=None):
    p_index = int(request.GET.get('page', 1))  # 当前页码

    if filter =={}:
    # 不带搜索条件
        api_list = API_Manage().get_all_api_list()  # 查询的数据
    else:
    # 有搜索条件
        api_list = API_Manage().get_api_list(path=filter['path'], reqcode=filter['reqcode'], project_name=filter['project_name'])
        ......
    data = {'page': page, 'paginator': paginator, 'current_page': current_page, 'page_range': page_range}
    return data

视图:搜索

def api_search(request):
    dict_key = {}
    path = request.GET.get('path', None)
    reqcode = request.GET.get('reqcode', None)
    project_name = request.GET.get('project_name', None)
    mywhere = []
    if path or reqcode or project_name:
        dict_key['path'] = path
        dict_key['reqcode'] = reqcode
        dict_key['project_name'] = project_name
        mywhere.append("path=" + path)
        mywhere.append("reqcode=" + reqcode)
        mywhere.append("project_name=" + project_name)
    data = get_api_list(request,dict_key)
    data.update({'mywhere': mywhere})
    return render(request, 'api_list.html', data)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当然可以,下面是一个简单的 Django 搜索功能的示例代码: 首先,在 Django 创建一个模型,例如“Book”模型: ```python from django.db import models class Book(models.Model): title = models.CharField(max_length=100) author = models.CharField(max_length=100) publication_date = models.DateField() def __str__(self): return self.title ``` 然后,在 Django 创建一个搜索视图: ```python from django.shortcuts import render from django.db.models import Q from .models import Book def search(request): query = request.GET.get('q') results = Book.objects.filter( Q(title__icontains=query) | Q(author__icontains=query) ) return render(request, 'search_results.html', {'results': results}) ``` 在这个视图,我们首先获取用户输入的查询字符串,然后使用 Django 的 Q 对象执行一个 OR 查询,以查找书籍标题或作者包含查询字符串的所有书籍。最后,我们将结果传递给一个名为“search_results.html”的模板,以呈现搜索结果。 最后,在 Django 创建一个搜索表单,例如: ```html <form method="GET" action="{% url 'search' %}"> <input type="text" name="q" placeholder="Search..."> <button type="submit">Search</button> </form> ``` 这将创建一个简单的搜索表单,其用户可以输入查询字符串并提交表单以执行搜索。 ### 回答2: 要实现搜索功能,可以使用Django提供的QuerySet对象和Q对象进行查询操作。首先在视图函数获取用户输入的搜索关键字。然后使用Q对象创建查询条件,包括搜索关键字在适当的字段出现的要求。最后通过调用filter函数对查询条件进行过滤,获取满足条件的对象。 具体的代码示例如下: ```python from django.shortcuts import render from django.db.models import Q from .models import MyModel def search(request): keyword = request.GET.get('keyword') objects = MyModel.objects.filter( Q(field1__icontains=keyword) | # 匹配 field1 包含 keyword 的对象 Q(field2__icontains=keyword) # 匹配 field2 包含 keyword 的对象 ) return render(request, 'search_result.html', {'objects': objects}) ``` 上述代码,假设有一个名为MyModel的模型类,其包含field1和field2两个字段。在视图函数search,通过request.GET.get('keyword')获取用户在搜索输入的关键字。然后使用filter函数对MyModel对象进行过滤,通过Q对象创建查询条件。下面的示例使用icontains函数进行不区分大小写的模糊查询,你也可以根据需要选择其他查询方式。 最后将满足条件的对象传递给模板,并在模板展示搜索结果。在模板可以使用for循环遍历objects对象,展示对象的相关信息。 希望以上回答对你有帮助! ### 回答3: 在Django实现搜索功能需要以下几个步骤: 1. 创建一个模型类,用于表示你要搜索的数据对象。例如,如果你要搜索文章的标题和内容,可以定义一个Article模型类,并定义相应的字段。 ```python from django.db import models class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() # 其他字段... ``` 2. 创建一个搜索表单,用于接收用户的搜索关键字。可以使用Django的Forms模块来实现。例如,可以创建一个SearchForm表单类,其包含一个CharField用于接收搜索关键字。 ```python from django import forms class SearchForm(forms.Form): keyword = forms.CharField(max_length=100) # 其他字段... ``` 3. 创建一个搜索视图函数,用于处理用户的搜索请求。在视图函数,首先根据用户提交的搜索关键字过滤模型数据,然后将过滤后的结果传递给模板渲染。 ```python from django.shortcuts import render from .forms import SearchForm from .models import Article def search(request): form = SearchForm(request.GET) if form.is_valid(): keyword = form.cleaned_data['keyword'] results = Article.objects.filter(title__contains=keyword) | Article.objects.filter(content__contains=keyword) else: results = None return render(request, 'search.html', {'form': form, 'results': results}) ``` 4. 创建一个模板文件,用于展示搜索结果以及搜索表单。例如,可以创建一个search.html模板文件。 ```html <form method="get" action="{% url 'search' %}"> {{ form }} <input type="submit" value="搜索"> </form> {% if results %} <ul> {% for article in results %} <li>{{ article.title }}</li> {% empty %} <li>没有找到匹配的结果。</li> {% endfor %} </ul> {% endif %} ``` 上述代码实现了一个基本的搜索功能,用户可以在表单输入关键字,点击搜索按钮后,系统将根据关键字查询相关的文章,并在页面上展示搜索结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值