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 相关文章推荐
Django发送html邮件的方法
May 26 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
python搭建服务器实现两个Android客户端间收发消息
Apr 12 Python
Flask框架URL管理操作示例【基于@app.route】
Jul 23 Python
python实现换位加密算法的示例
Oct 14 Python
python的继承知识点总结
Dec 10 Python
Python实现的IP端口扫描工具类示例
Feb 15 Python
python实现五子棋人机对战游戏
Mar 25 Python
python实现差分隐私Laplace机制详解
Nov 25 Python
在Keras中实现保存和加载权重及模型结构
Jun 15 Python
Python中相见恨晚的技巧
Apr 13 Python
OpenCV-Python实现轮廓的特征值
Jun 09 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实现高效获取图片尺寸的方法
2014/12/12 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
基于jQuery仿淘宝产品图片放大镜特效
2020/10/19 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
2016/06/14 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
详解Javascript函数声明与递归调用
2016/10/22 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
2020/11/17 Vue.js
Python对象体系深入分析
2014/10/28 Python
在MAC上搭建python数据分析开发环境
2016/01/26 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
pandas带有重复索引操作方法
2018/06/08 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
Python如何操作office实现自动化及win32com.client的运用
2020/04/01 Python
CSS+jQuery+PHP+MySQL实现的在线答题功能
2015/04/25 HTML / CSS
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
.NET概念性的面试题
2012/02/29 面试题
劳模事迹材料范文
2014/12/24 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫