Django 简单实现分页与搜索功能的示例代码


Posted in Python onNovember 07, 2019

假设现有需求如下:

需要一个页面分页展示信息,在该页面添加搜索框以提供检索功能。

那么,我们知道,展示信息和检索功能是在同一个页面,也就是共用一个路由。

代码如下:

第一步,写路由:为了清晰,这里只给出主页和展示页面的路由。

urls.py:

from django.urls import path
from . import views
from django.conf.urls.static import static
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
 
# from django.contrib import staticfiles
 
urlpatterns = [
 # 主页
 path('', views.index),
 
 # 访问他人信息入口,分页展示
 path('other/profile', views.request_user),
 
 
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += staticfiles_urlpatterns()

第二步,写视图:这里做了访问限制,登录才能访问

views.py:

from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect, HttpResponse
from django.contrib.auth import authenticate, login, logout
from .models import UserInfo, Email_Message, Wastes
from django.contrib.auth.models import AnonymousUser
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 
@login_required(login_url='/tologin')
def request_user(request):
 # 实现搜索
 key = request.GET.get('key')
 all_users = UserInfo.objects.filter(cate="买家").all()
 userlist = []
 # 如果前端传入关键字,才会进行检索,否则显示全部买家
 if key:
  for user in all_users:
   if key in user.address:
    userlist.append(user)
  all_users = userlist
 if all_users:
  paginator = Paginator(all_users, 2)
  page = request.GET.get('page')
  try:
   contacts = paginator.page(page)
  except PageNotAnInteger:
   contacts = paginator.page(1)
  except EmptyPage:
   contacts = paginator.page(paginator.num_pages)
  return render(request, 'Myapp/userlist.html', {'contacts': contacts})
 else:
  info = '暂无数据'
  return render(request, 'Myapp/userlist.html', {'info': info})

分页的原理是用到了django自带的分页组件

需要注意的是,搜索的关键字传参,用的是GET请求,而不是POST请求

简单来说,就是先判断前端页面是否用搜索框搜索了关键字,如果搜索了,那么这个词会被

key = request.GET.get('key')

赋值给key,然后进行后续判断处理即可。

如果没有,就正常展示我们需要展示的。

分页的原理。

可以去看这个组件的文档介绍。

如果返回的key检索不到结果,返回空数据页,并提醒。

html代码:

{% load static %}
<!--[if lt IE 7 ]><html class="ie ie6" lang="en"> <![endif]-->
<!--[if IE 7 ]><html class="ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 9)|!(IE)]><!-->
<html lang="en"> <!--<![endif]-->
<head>
 
 <!-- favicon.ico
 ================================================== -->
 <link rel='shortcut icon' href="{% static 'Myapp/img/favicon.con' %}" rel="external nofollow" type="image/x-icon"/>
 
 <!-- Basic Page Needs
 ================================================== -->
 <meta charset="utf-8">
 <title>Detail</title>
 <meta name="description" content="">
 <meta name="author" content="">
 
 <!-- Mobile Specific Metas
	================================================== -->
 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
 
 <!-- CSS
	================================================== -->
 <link rel="stylesheet" href="{% static 'Myapp/css/zerogrid.css' %}" rel="external nofollow" >
 <link rel="stylesheet" href="{% static 'Myapp/css/style.css' %}" rel="external nofollow" >
 <link rel="stylesheet" href="{% static 'Myapp/css/lightbox.css' %}" rel="external nofollow" >
 
 <!-- Custom Fonts -->
 <link href="{% static 'Myapp/assets/css/font-awesome.min.css' %}" rel="external nofollow" rel="stylesheet" type="text/css">
 
 
 <link rel="stylesheet" href="{% static 'Myapp/css/menu.css' %}" rel="external nofollow" >
 <link rel="stylesheet" href="{% static 'Myapp/assets/css/bootstrap.min.css' %}" rel="external nofollow" >
 <script src="{% static 'Myapp/js/jquery1111.min.js' %}" type="text/javascript"></script>
 <script src="{% static 'Myapp/js/script.js' %}"></script>
 
 <!--[if lt IE 8]>
  <div style=' clear: both; text-align:center; position: relative;'>
   <a href="http://windows.microsoft.com/en-US/internet-explorer/Items/ie/home?ocid=ie6_countdown_bannercode" rel="external nofollow" >
   <img src="http://storage.ie6countdown.com/assets/100/images/banners/warning_bar_0000_us.jpg" border="0" height="42" width="820" alt="You are using an outdated browser. For a faster, safer browsing experience, upgrade for free today." />
  </a>
  </div>
 <![endif]-->
 <!--[if lt IE 9]>
		<script src="js/html5.js"></script>
		<script src="js/css3-mediaqueries.js"></script>
	<![endif]-->
 
</head>
 
<body>
<div class="wrap-body">
 
 <!--////////////////////////////////////Header-->
 <header class="zerogrid">
  <div class="logo"><img src="{% static 'Myapp/img/logo.png' %}" alt=""/></div>
  <div id='cssmenu' class="align-center">
   <ul>
    <li><a href='http://127.0.0.1:8000/'><span>主页</span></a></li>
    <li><a href='http://127.0.0.1:8000/about'><span>关于我们</span></a></li>
    <li><a href='http://127.0.0.1:8000/show_detail'><span>每日看价</span></a></li>
    <li><a href='http://127.0.0.1:8000/other/profile'><span>找个买家</span></a></li>
    <li class='last'><a href='http://127.0.0.1:8000/contact'><span>联系我们</span></a></li>
   </ul>
  </div>
  <form style="float: right">
   {% csrf_token %}
   <label>
    <div class="form-group">
     <input type="search" class="form-control" name="key" placeholder="您可输入所在城市以检索买家">
    </div>
   </label>
   <input class="btn btn-default" type="submit" value="搜索">
  </form>
 </header>
 
 <!--////////////////////////////////////Container-->
 <div style="text-align: center">
  <table style="float: contour; margin:0 auto;text-align: center; width: 800px;" class="table table-bordered">
   <tr style="text-align: center" class="success">
    <td>昵称</td>
    <td>地址</td>
    <td>最近活跃</td>
   </tr>
   {% for u in contacts %}
    <tr class="info">
     <td><a
       href="http://127.0.0.1:8000/other/profile/{{ u.username }}" rel="external nofollow" >{{ u.username }}</a>
     </td>
     <td>{{ u.address }}</td>
     <td>{{ u.last_login }}</td>
    </tr>
   {% endfor %}
  </table>
 </div>
 
 
 <div class="navigation">
  <ul>
   {% for pg in contacts.paginator.page_range %}
    {% if contacts.number == pg %}
     <li class="active"><a href="?page={{ pg }}" rel="external nofollow" rel="external nofollow" >{{ pg }}</a></li>
    {% else %}
     <li><a href="?page={{ pg }}" rel="external nofollow" rel="external nofollow" >{{ pg }}</a></li>
    {% endif %}
   {% endfor %}
 
   {% if contacts.has_next %}
    <li><a href="?page={{ contacts.next_page_number }}" rel="external nofollow" >下一页</a></li>
   {% endif %}
  </ul>
 </div>
 <!--////////////////////////////////////Footer-->
 
</div>
{% if info %}
 <script>
  window.alert('{{ info }}');
 </script>
{% endif %}
</body>
</html>

效果:

主页主要功能部分:

Django 简单实现分页与搜索功能的示例代码

信息页分页与搜索:搜索框和分页都是存在的,目前是第一页:http://127.0.0.1:8000/other/profile

Django 简单实现分页与搜索功能的示例代码

第二页:http://127.0.0.1:8000/other/profile?page=2

Django 简单实现分页与搜索功能的示例代码

搜索测试:

Django 简单实现分页与搜索功能的示例代码

Django 简单实现分页与搜索功能的示例代码

搜索无效信息测试:

Django 简单实现分页与搜索功能的示例代码

Django 简单实现分页与搜索功能的示例代码

Django 简单实现分页与搜索功能的示例代码

算是比较完整了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用python获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
跟老齐学Python之有点简约的元组
Sep 24 Python
PyQt5固定窗口大小的方法
Jun 18 Python
python 字段拆分详解
Dec 17 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
Jan 21 Python
flask 框架操作MySQL数据库简单示例
Feb 02 Python
python isinstance函数用法详解
Feb 13 Python
python-docx文件定位读取过程(尝试替换)
Feb 13 Python
python实现人像动漫化的示例代码
May 17 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
Jun 24 Python
Selenium python时间控件输入问题解决方案
Jul 22 Python
使用OpenCV实现人脸图像卡通化的示例代码
Jan 15 Python
Flask框架请求钩子与request请求对象用法实例分析
Nov 07 #Python
Django框架ORM数据库操作实例详解
Nov 07 #Python
Python程序暂停的正常处理方法
Nov 07 #Python
浅析python redis的连接及相关操作
Nov 07 #Python
大家都说好用的Python命令行库click的使用
Nov 07 #Python
flask 实现token机制的示例代码
Nov 07 #Python
python3反转字符串的3种方法(小结)
Nov 07 #Python
You might like
PHP 生成的XML以FLASH获取为乱码终极解决
2009/08/07 PHP
解析在PHP中使用全局变量的几种方法
2013/06/24 PHP
php实现发送微信模板消息的方法
2015/03/07 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
Javascript new关键字的玄机 以及其它
2010/08/25 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
JavaScript中实现最高效的数组乱序方法
2014/10/11 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
用js动态添加html元素,以及属性的简单实例
2016/07/19 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
js动态引入的四种方法
2018/05/05 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
vue框架中props的typescript用法详解
2020/02/17 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
js实现时间日期校验
2020/05/26 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python在windows下实现备份程序实例
2014/07/04 Python
Python素数检测实例分析
2015/06/15 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
详解python中sort排序使用
2019/03/23 Python
python pygame实现滚动横版射击游戏城市之战
2019/11/25 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
python 实现表情识别
2020/11/21 Python
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
《匆匆》教学反思
2014/02/22 职场文书
领导班子个人对照检查材料(群众路线)
2014/09/26 职场文书