Django开发运维后台(三):利用ListView分页显示数据

简介:

ListView变量与方法请看:http://ccbv.co.uk/projects/Django/1.6/django.views.generic.list/ListView/

前端样式使用Bootstrap3:http://v3.bootcss.com/getting-started/

Jinja2模板系统文档:http://docs.jinkan.org/docs/jinja2/


1、views.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from  django.shortcuts  import  render
from  django.http.response  import  HttpResponse
from  django.views.generic  import   View, ListView
#model
from  models  import  *
#python
import  urllib2
 
......
 
class  ServerListIndex(ListView):
     context_object_name  =  'serverlist'
     template_name  =  'serverlist.jinja.html'
     paginate_by  =  50
     model  =  ServerList

ListView只需要传好变量即可使用:

context_object_name是数据库搜索出来的结果存放的变量名字,用于模板循环显示

template_name加载该html文件

paginate_by设置分页中每一页的记录数目

model定义从哪份model中查询


2、urls.py:

1
2
3
4
5
6
urlpatterns  =  patterns('',
     url(r '^test/$' , TemplateView.as_view(template_name = 'base2.jinja.html' )),
 
     url(r 'update/$' , Update_ServerList.as_view(), name = "update_serverlist" ),
     url(r '^$' , ServerListIndex.as_view(), name = 'serverlist' ),
)


3、模板,模板我采用了继承,父模板是整个网站的框架,有点长不好放出来,这里只放子模板:

serverlist.jinja.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
{% extends "base2.jinja.html" %}
{% set active_page = 'serverlist' -%}
{% block body %}
 
     < form  class = "form-inline"  role = "form"  action = ""  method = "GET" >
         < div  class = "panel panel-default" >
             < table  class = "table table-striped table-bordered table-hover table-condensed" >
                 < thead >
                   < tr >
                     < th >平台</ th >
                     < th >服务器名称</ th >
                     < th >合服列表</ th >
                     < th >开服时间</ th >
                     < th >域名/IP</ th >
                     < th ></ th >
                   </ tr >
                 </ thead >
                 < tbody >
                     {% for server in serverlist %}
                       < tr >
                         < td >{{ server.plat }}</ td >
                         < td >{{ server.server_num }}服-{{ server.server_name }}</ td >
                         < td >{{ server.hefu_range.replace('-',',') }}</ td >
                         < td >{{ server.open_time }}</ td >
                         < td >
                             {{ server.domain }}< br >
                             {{ server.dx_ip }}/{{ server.lt_ip }}
                         </ td >
                         < th >< a  href = "#"  class = "btn btn-primary"  role = "button" >执行命令</ a ></ th >
                       </ tr >
                     {% endfor %}
                 </ tbody >
             </ table >
         </ div >
         < div  class = "panel-default" >
             < center >
                 < ul  class = "pagination" >
                     < li >< a  href = "{{ request.path }}?page=1" >&laquo;</ a ></ li >
                     {% if page_obj.has_previous() %}
                         < li >< a  href = "{{ request.path }}?&page={{ page_obj.previous_page_number() }}" >上一页</ a ></ li >
                     {% else %}
                         < li  class = "previous disabled" >< a >上一页</ a ></ li >
                     {% endif %}
                     {% for i in page_obj.paginator.page_range %}
                         < li  {% if page_obj.number == i %} class = "active" {% endif %}>< a  href = "{{ request.path }}?page={{ i }}" >{{ i }}</ a ></ li >
                     {% endfor %}
                     {% if page_obj.has_next() %}
                         < li >< a  href = "{{ request.path }}?page={{ page_obj.next_page_number() }}" >下一页</ a ></ li >
                     {% else %}
                         < li  class = "previous disabled" >< a >下一页</ a ></ li >
                     {% endif %}
                     < li >< a  href = "{{ request.path }}?page={{ page_obj.paginator.num_pages }}" >&raquo;</ a ></ li >
                 </ ul >
             </ center >
         </ div >
     </ form >
 
{% endblock %}

page_obj是分页对像实例,这个名字是ListView默认生成的


page_obj的变量:

page_obj.paginator.page_range:所有分页的number,是一个list

page_obj.number:当前分页的页码

page_obj.paginator.num_pages:总分页数,就是一共有多少页


page_obj的方法:

page_obj.has_previous():判断是否有上一页

page_obj.previous_page_number():返回上一页的number

page_obj.has_next():判断是否有下一页

page_obj.next_page_number():返回下一页的number


现在实现的效果:

wKioL1O8r-yhSvXYAAA8MhU_M3g693.jpg

wKiom1O8sBvSfkN_AAA7BBeif3Q653.jpg


4、基本的分页是做好了,现在需要加多一个搜索的功能,

先改造views.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class  ServerListIndex(ListView):
     context_object_name  =  'serverlist'
     template_name  =  'serverlist.jinja.html'
     paginate_by  =  50
     #model = ServerList
     http_method_names  =  [u 'get' ,]
 
     def  get_queryset( self ):
         serverlist  =  ServerList.objects. all ()
         plat  =  self .request.GET.get( 'plat' )
         keyword  =  self .request.GET.get( 'keyword' )
         if  plat:
             serverlist  =  serverlist. filter (plat = plat)
         if  keyword:
             serverlist  =  serverlist. filter (Q(dx_ip = keyword)|Q(lt_ip = keyword)|Q(domain = keyword))
         return  serverlist
 
     def  get_context_data( self * * kwargs):
         context  =  super (ServerListIndex, self ).get_context_data( * * kwargs)
         platlist  =  ServerList.objects.values( 'plat' ).annotate()
         context[ 'platlist' =  platlist
         return  context

重写了get_queryset方法,达到利用get参数自定义SQL的作用

重新get_context_data方法,相当于return render_to_response(xxx.html,{},context_instance=RequestContext(request))中的{}的内容,就是传给模板的变量


然后把html增加一个搜索菜单:

serverlist.jinja.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
{% extends "base2.jinja.html" %}
{% set active_page = 'serverlist' -%}
{% block body %}
     < form  class = "form-inline"  role = "form"  action = ""  method = "GET" >
         < div  class = "panel panel-default" >
             < div  class = "panel-heading" >
                   < div  class = "form-group" >
                         < select  name = "plat"  class = "form-control" >
                             < option  value = "" >--全部--</ option >
                             {% for i in platlist -%}
                                  < option  value = "{{ i.plat }}"  {% if request.GET.plat  == i.plat -%}selected{% endif -%}>{{ i.plat }}</ option >
                             {% endfor -%}
                         </ select >
                   </ div >
                   < div  class = "form-group" >
                     < input  type = "input"  name = "keyword"  class = "form-control"  placeholder = "请输入域名或者IP"  value = "{{ request.GET.keyword }}" >
                   </ div >
                   < button  type = "submit"  class = "btn btn-primary" >Search</ button >
 
             </ div >
             < table  class = "table table-striped table-bordered table-hover table-condensed" >
                 < thead >
                   < tr >
                     < th >平台</ th >
                     < th >服务器名称</ th >
                     < th >合服列表</ th >
                     < th >开服时间</ th >
                     < th >域名/IP</ th >
                     < th ></ th >
                   </ tr >
                 </ thead >
                 < tbody >
                     {% for server in serverlist -%}
                       < tr >
                         < td >{{ server.plat }}</ td >
                         < td >{{ server.server_id }}服-{{ server.server_name }}</ td >
                         < td >{{ server.hefu_range.replace('-',',').strip() }}</ td >
                         < td >{{ server.open_time }}</ td >
                         < td >
                             {{ server.domain }}< br >
                             {{ server.dx_ip }}/{{ server.lt_ip }}
                         </ td >
                         < th >< a  href = "#"  class = "btn btn-primary"  role = "button" >执行命令</ a ></ th >
                       </ tr >
                     {% endfor -%}
                 </ tbody >
             </ table >
         </ div >
         < div  class = "panel-default" >
             < center >
                 < ul  class = "pagination" >
                     < li >< a  href = "{{ request.path }}?plat={{ request.GET.plat }}&keyword={{ request.GET.keyword }}&page=1" >&laquo;</ a ></ li >
                     {% if page_obj.has_previous() %}
                         < li >< a  href = "{{ request.path }}?plat={{ request.GET.plat }}&keyword={{ request.GET.keyword }}&page={{ page_obj.previous_page_number() }}" >上一页</ a ></ li >
                     {% else %}
                         < li  class = "previous disabled" >< a >上一页</ a ></ li >
                     {% endif %}
                     {% for i in page_obj.paginator.page_range %}
                         < li  {% if page_obj.number == i %} class = "active" {% endif %}>< a  href = "{{ request.path }}?plat={{ request.GET.plat }}&keyword={{ request.GET.keyword }}&page={{ i }}" >{{ i }}</ a ></ li >
                     {% endfor %}
                     {% if page_obj.has_next() %}
                         < li >< a  href = "{{ request.path }}?plat={{ request.GET.plat }}&keyword={{ request.GET.keyword }}&page={{ page_obj.next_page_number() }}" >下一页</ a ></ li >
                     {% else %}
                         < li  class = "previous disabled" >< a >下一页</ a ></ li >
                     {% endif %}
                     < li >< a  href = "{{ request.path }}?plat={{ request.GET.plat }}&keyword={{ request.GET.keyword }}&page={{ page_obj.paginator.num_pages }}" >&raquo;</ a ></ li >
                 </ ul >
             </ center >
         </ div >
     </ form >
 
{% endblock %}

wKioL1O8s_jzej5lAAByCbW94h0417.jpg

wKioL1O892DAyvrGAABYWlsRYjU848.jpg

因为加多了get参数,所以网页尾部的分页还要加上GET参数

看了下效果感觉还过得去。。

本文转自运维笔记博客51CTO博客,原文链接http://blog.51cto.com/lihuipeng/1436010如需转载请自行联系原作者


lihuipeng


相关文章
|
17天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
103 45
|
6天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
18 2
|
1月前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
38 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
18天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
30 2
|
1月前
|
运维 Java Linux
【运维基础知识】掌握VI编辑器:提升你的Java开发效率
本文详细介绍了VI编辑器的常用命令,包括模式切换、文本编辑、搜索替换及退出操作,帮助Java开发者提高在Linux环境下的编码效率。掌握这些命令,将使你在开发过程中更加得心应手。
32 2
|
1月前
|
存储 运维 监控
实时计算Flink版在稳定性、性能、开发运维、安全能力等等跟其他引擎及自建Flink集群比较。
实时计算Flink版在稳定性、性能、开发运维和安全能力等方面表现出色。其自研的高性能状态存储引擎GeminiStateBackend显著提升了作业稳定性,状态管理优化使性能提升40%以上。核心性能较开源Flink提升2-3倍,资源利用率提高100%。提供一站式开发管理、自动化运维和丰富的监控告警功能,支持多语言开发和智能调优。安全方面,具备访问控制、高可用保障和全链路容错能力,确保企业级应用的安全与稳定。
39 0
|
3月前
|
运维 Devops 持续交付
自动化运维之路:从脚本到DevOps探索后端开发:从基础到高级实践
【8月更文挑战第28天】在数字化时代的浪潮中,企业对于IT运维的要求越来越高。从最初的手动执行脚本,到如今的自动化运维和DevOps实践,本文将带你领略运维的演变之旅。我们将探索如何通过编写简单的自动化脚本来提升效率,进而介绍DevOps文化的兴起及其对现代运维的影响。文章将为你揭示,通过持续集成、持续部署和微服务架构的实践,如何构建一个高效、可靠的运维体系。准备好让你的运维工作变得更加智能化和自动化了吗?让我们一起踏上这段旅程。 【8月更文挑战第28天】 本文旨在为初学者和有一定经验的开发者提供一个深入浅出的后端开发之旅。我们将一起探索后端开发的多个方面,包括语言选择、框架应用、数据库设计
|
3月前
|
C++ Python
Django视图函数VS类视图:如何选择最适合你的开发方式?
【8月更文挑战第31天】本文对比了Django中的函数视图和类视图。函数视图直接处理HTTP请求和响应,灵活且易于维护,适用于简单业务逻辑;类视图基于Python类,提供更丰富的功能和更高的灵活性,适合处理复杂业务逻辑。选择哪种视图取决于具体需求,合理使用两者可帮助你构建高效且易维护的Django应用。
58 0
|
21天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
28 1
|
2月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
121 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面