自定义分页

简单例子:

urls.py:

from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
from app01 import views
urlpatterns = [ url(r'^user_list/',views.user_list),
]

先固定写死数据:view.py:

LIST = []
for i in range(100):
LIST.append(i)
def user_list(request):
current_page = request.GET.get('p',1)
current_page = int(current_page)
start = (current_page-1)*10
end = current_page * 10
data = LIST[start:end]
return render(request,'user_list.html',{'li':data})

user_item.py

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
{% for item in li %}
{% include 'li.html' %}
{% endfor %}
</ul>
<div>
<a href="/user_list/?p=1">1</a>
<a href="/user_list/?p=2">2</a>
<a href="/user_list/?p=3">3</a>
</div>
</body>
</html>

显示效果:

我们都知道后台穿过来的是一个字符串,如果我们把那些a标签从后台传过来,那会是什么样的呢?

views.py:

def user_list(request):
current_page = request.GET.get('p',1)
current_page = int(current_page)
start = (current_page-1)*10
end = current_page * 10
data = LIST[start:end]
page_str = '''
<a href="/user_list/?p=1">1</a>
<a href="/user_list/?p=2">2</a>
<a href="/user_list/?p=3">3</a>
'''
#return render(request,'user_list.html',{'li':data})
return render(request,'user_list.html',{'page_str':page_str,'li':data})

html.py:

<div>
{{ page_str }}
</div>

显示效果:

这里可以引入一个知识:XSS攻击:即评论,输入框等输入一些脚本,for循环。

如果想要显示的话:

第一种方法:

{{ page_str|safe }}

第二种方法:

from django.utils.safestring import mark_safe
page_str = '''
<a href="/user_list/?p=1">1</a>
<a href="/user_list/?p=2">2</a>
<a href="/user_list/?p=3">3</a>
'''
page_str = mark_safe(page_str)

分页1.0版本:使用固定的列表数据,然后获得页数,

views.py:

def user_list(request):
current_page = request.GET.get('p',1)
current_page = int(current_page)
start = (current_page-1)*10
end = current_page * 10
data = LIST[start:end] all_count = len(LIST)
count,y = divmod(all_count,10)
if y:
count+=1 page_list = []
for i in range(1,count+1):
if i == current_page:
temp = '<a class="page active" href="/user_list/?p=%s">%s</a>' % (i, i)
else:
temp = '<a class="page" href="/user_list/?p=%s">%s</a>' %(i,i)
page_list.append(temp) page_str = "".join(page_list) return render(request,'user_list.html',{'page_str':page_str,'li':data})

html文件:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.pagination .page{
display: inline-block;
padding:5px;
background-color: seashell;
margin:5px;
}
.pagination .active{
background-color: coral;
}
</style>
</head>
<body>
<ul>
{% for item in li %}
{% include 'li.html' %}
{% endfor %}
</ul>
<div class="pagination">
{{ page_str|safe }}
</div>
</body>
</html>

显示效果:

上面的分页代码我们在数据少的时候将就一下,但是如果一旦我们的数据多了,那我们如果一下子把所有的页数都显示在html中,那显然是不合适的,那我们应该要隐藏多的页数

那我们需要该for循环,显示当前页的前五个和后五个,来我们改写一些views里面的函数:

 def user_list(request):
current_page = request.GET.get('p',1)
current_page = int(current_page)
page_size = 10#页面一次显示多少条数据
page_num=11#页面显示的页数
start = (current_page-1)*page_size
end = current_page * page_size
data = LIST[start:end] all_count = len(LIST)
count,y = divmod(all_count,page_size)
if y:
count+=1 page_list = []
if count <= 11:
start_index = 1
end_index = count+1
elif count > 11:
if current_page <= (page_num+1)/2:
start_index = 1
end_index = page_num + 1
elif (current_page+(page_num-1)/2) > count :
start_index = count-page_num+1
end_index = count + 1
else:
start_index = current_page - (page_num-1)/2
end_index = current_page + (page_num+1)/2
if current_page != 1:
prev_page = '<a class="page" href="/user_list/?p=%s">上一页</a>' % (current_page-1)
page_list.append(prev_page)
for i in range(int(start_index),int(end_index)):
if i == current_page:
temp = '<a class="page active" href="/user_list/?p=%s">%s</a>' % (i, i)
else:
temp = '<a class="page" href="/user_list/?p=%s">%s</a>' %(i,i)
page_list.append(temp)
if current_page != count:
after_page = '<a class="page" href="/user_list/?p=%s">下一页</a>' % (current_page + 1)
page_list.append(after_page) jump = '''
<input type="text" /><a onclick='jumpTo(this,"/user_list/?p=");'>GO</a>
<script>
function jumpTo(ths,base){
var val = ths.previousSibling.value;
location.href = base+val;
}
</script>
'''
page_list.append(jump)
page_str = "".join(page_list) #return render(request,'user_list.html',{'li':data})
return render(request,'user_list.html',{'page_str':page_str,'li':data})

效果显示:这样就实现了上一页下一页,跳转,根据当前页数的不同显示不一样的页码

我们再把这个分页功能封装成一个Page类,以后就可以通过类方法来生成分页:

 class Page(object):
def __init__(self,current_page,data_count,page_size=10,page_num=11):
self.current_page = current_page
self.data_count = data_count
self.page_size = page_size
self.page_num = page_num
@property
def start(self):
return (self.current_page-1)*self.page_size @property
def end(self):
return self.current_page * self.page_size @property
def allCount(self):
count, y = divmod(self.data_count, self.page_size)
if y:
count += 1
return count def pageList(self,count,base_url):
page_list = []
if count <= 11:
start_index = 1
end_index = count + 1
elif count > 11:
if self.current_page <= (self.page_num + 1) / 2:
start_index = 1
end_index = self.page_num + 1
elif (self.current_page + (self.page_num - 1) / 2) > count:
start_index = count - self.page_num + 1
end_index = count + 1
else:
start_index = self.current_page - (self.page_num - 1) / 2
end_index = self.current_page + (self.page_num + 1) / 2
if self.current_page != 1:
prev_page = '<a class="page" href="%s?p=%s">上一页</a>' % (base_url,self.current_page - 1)
page_list.append(prev_page)
for i in range(int(start_index), int(end_index)):
if i == self.current_page:
temp = '<a class="page active" href="%s?p=%s">%s</a>' % (base_url,i, i)
else:
temp = '<a class="page" href="%s?p=%s">%s</a>' % (base_url,i, i)
page_list.append(temp)
if self.current_page != count:
after_page = '<a class="page" href="%s?p=%s">下一页</a>' % (base_url,self.current_page + 1)
page_list.append(after_page) jump = '''
<input type="text" /><a onclick='jumpTo(this,"%s?p=");'>GO</a>
<script>
function jumpTo(ths,base){
var val = ths.previousSibling.value;
location.href = base+val;
}
</script>
''' % (base_url)
page_list.append(jump)
return page_list

然后创建一个utils,把分页类放在里面,用的时候调用就可以了

调用分页类:

from utils.pagination import Page
LIST = []
for i in range(1009):
LIST.append(i)
def user_list(request):
current_page = request.GET.get('p',1)
current_page = int(current_page) page = Page(current_page,len(LIST)) data = LIST[ page.start : page.end ] count = page.allCount page_list = page.pageList(count,'/user_list/') page_str = "".join(page_list)
#return render(request,'user_list.html',{'li':data})
return render(request,'user_list.html',{'page_str':page_str,'li':data})

Django学习---自定义分页的更多相关文章

  1. django上课笔记2-视图CBV-ORM补充-Django的自带分页-Django的自定义分页

    一.视图CBV 1.urls url(r'^login.html$', views.Login.as_view()), 2.views from django.views import View cl ...

  2. Django框架---- 自定义分页组件

    分页的实现与使用 class Pagination(object): """ 自定义分页 """ def __init__(self,cur ...

  3. django【自定义分页】

    1. views.py def app(request): page_info = PageInfo(request.GET.get('p'), 6, 100, request.path_info, ...

  4. 7.django之自定义分页记录

    只是大概记录下步骤: 1.表结构: class UserProfile(models.Model): ''' 用户表 ''' user = models.OneToOneField(User,verb ...

  5. Django之自定义分页

    分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置. 1. 每页显示的数据条数 2. 每页显示页号链接数 3. 上一页和下一页 4. ...

  6. python 学习笔记十八 django深入学习三 分页,自定义标签,权限机制

    django  Pagination(分页) django 自带的分页功能非常强大,我们来看一个简单的练习示例: #导入Paginator>>> from django.core.p ...

  7. Django学习手册 - 初识自定义分页

    核心: <a href='http://127.0.0.1:8000/index-%s'>%s<a> 自定义分页 1.前端处理字符 后端的字符  return render(r ...

  8. Django学习笔记之Cookie、Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  9. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)

    一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...

随机推荐

  1. OPEN(SAP) UI5 学习入门系列之一:扫盲与热身(下)

    1 UI5代码结构 上一次我们一起用了20秒的时间完成一个UI5版的Hello World.应用打开后有一个按钮,按钮的文字是Hello World,点击这个按钮之后,按钮会慢慢的消失掉(Fade o ...

  2. wireshark的提示

    内容:12个wrieshark的提示 1.[Packet size limited during capture] 在捕获数据包大小有限,即包没有抓全 2.[TCP previous segment ...

  3. php pdo调用SQLServer存储过程无法获取返回结果

    确定存储过程写的没问题,php调用后,跟踪了语句,也是没问题,就是获取不到返回结果.折腾,搞定. 较之前明确了1. 调用存储过程传参的写法: 2. 获取返回结果集的方法 参考: http://blog ...

  4. ASP.NET网站发布时的那些坑

    开发工具:VS2010,MVC4.0,SQLSERVER2008 服务器:Windows server 2012,IIS8,SQLSERVER2012 一.发布后,每个页面第一次打开都很卡,50秒或更 ...

  5. BZOJ1113 Poi2008 海报PLA【单调栈】【水】

    BZOJ1113 Poi2008 海报PLA Description N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们. Input 第一行给出数字N,代表有N个矩形.N在[1,250 ...

  6. Object-C 中的Selector 概念

    selector可以叫做选择器,其实指的就是对象的方法,也可以理解为C语言里面的函数指针,在面向对象里面的对应概念. @selector(xxxx)的作用是找到名字为xxxx的方法.一般用于[a pe ...

  7. [Aizu2784]Similarity of Subtrees

    vjudge Description 给一棵\(n\)个节点的有根树,定义两棵树同构当且仅当他们每个深度的节点个数相同.问这个树上有多少对子树满足同构.\(n\le100000\). sol 树\(h ...

  8. GridView合并表头多重表头

    后台代码: using System; using System.Data; using System.Configuration; using System.Web; using System.We ...

  9. hashids 了解

    用于隐藏真实的id 原理是从数字经过一个加盐(salted)算法产生一个哈希(hash)字符串.这样算法就是通过混淆使结果具有不可预测性,而唯一性依然由数字本身来达成,从而得到(类似 youtube ...

  10. traits编程---萃取容器中迭代器的类型等

    可以直接利用STL中定义好的traits_iterator来萃取 /*特性萃取器*/ template <class unknown_class> struct unknown_class ...