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系列之从文件读取和保存数据
May 23 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 Python
让python 3支持mysqldb的解决方法
Feb 14 Python
浅谈Python使用Bottle来提供一个简单的web服务
Dec 27 Python
Python实现找出数组中第2大数字的方法示例
Mar 26 Python
浅析Python函数式编程
Oct 06 Python
Python读取mat文件,并保存为pickle格式的方法
Oct 23 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
Apr 23 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
Python实现仿射密码的思路详解
Apr 23 Python
Python循环之while无限迭代
Apr 30 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 session安全问题分析
2011/06/24 PHP
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
php多进程应用场景实例详解
2019/07/22 PHP
laravel 数据验证规则详解
2019/10/23 PHP
HTML TO JavaScript 转换
2006/06/26 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
js中Number数字数值运算后值不对的解决方法
2017/02/28 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
用C++封装MySQL的API的教程
2015/05/06 Python
利用python程序生成word和PDF文档的方法
2017/02/14 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
Python KMeans聚类问题分析
2018/02/23 Python
python dlib人脸识别代码实例
2019/04/04 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
python ETL工具 pyetl
2020/06/07 Python
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
惠普香港官方商店:HP香港
2019/04/30 全球购物
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
篮球兴趣小组活动总结
2014/07/07 职场文书