若何利用django自带的分页器(Paginator),本篇文章本家儿要环绕分页器,具体论述实现分页器功能。
这里我利用的是py3和django2.0版本!
东西/原料
- python3
- django2.0.3
Models模子点窜
- 1
from django.db import models
class Blog(models.Model):
title = models.CharField(max_length=50) # 题目 限制50字
content = models.TextField() # 文章内容
def __str__(self):
return self.title
class Meta: # 自界说排序
ordering = ['-id']
- 2
这里我在blog这个app下的models.py里面界说了一个Blog,CharField 字符串字段,用于较短的字符串,利用它时必需增添限制 max_length,TextField 字符串字段,可以保留年夜量文本。
- 3
模子点窜完跋文得先利用python manage.py makemigrations,然后再用
python manage.py migrate
Views视图点窜
- 1
def home(request):
context = {}
context['blogs'] = Blog.objects.all() # 获取全数文章
return render(request, "home.html", context)
url路由点窜
- 1
from django.contrib import admin
from django.urls import path
from blog import views
#127.0.0.1:8000
urlpatterns = [
path('admin/', admin.site.urls),
path('',views.home, name='home'),
]
- 2
django网页的默认打开网址是127.0.0.1:8000,当我们打开网址时,响应的就会由第二条path去执行,然后由views视图去响应这个请求
利用shell快速生当作年夜量数据
- 1
若是我们手动在后台建立一个个文章,显然是很慢的,是以我们可以利用shell来为我们快速生当作文章数据。起首在cmd号令模式下输入python manage.py shell,接着输入以下代码就能建立出31篇文章了!
- 2
from blog.models import Blog
for x in range(1,32):
blog = Blog()
blog.title = "第%s篇文章" %(x)
blog.content = "第%s篇内容" %(x)
blog.save()
Blog.objects.all() # 看看是否生当作了文章
添加模板
- 1
在APP目次下建立templates文件夹,并在该文件夹里建立一个home.html文件,接着添加内容
- 2
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
{% for blog in blogs %}
<p>{{ blog.title }}</p>
<p>{{ blog.content }}</p>
<hr>
{% endfor%}
</body>
</html>
- 3
接着python manage.py runserver之后打开网址127.0.0.1:8000,你会看到页面呈现31篇文章,若是文章篇数过多,会导致网页加载迟缓甚至卡死,并且十分不美不雅,是以我们就想到利用分页器来解决这个问题。
利用django自带的paginator分页器
- 1
在views.py添加代码
- 2
from django.shortcuts import render
from blog.models import Blog
from django.core.paginator import Paginator
def home(request):
context = {}
blogs = Blog.objects.all()
paginator = Paginator(blogs, 5) # 每5份内容分页一次
page_num = request.GET.get('page',1) # 获取url参数,127.0.0.1:8000/?page=<value>
# 不法数值则返回1 数值为空也返回1 如 127.0.0.1:8000/?page=asdsa
page_blogs = paginator.get_page(page_num) #获取当前(页码)所需要的文章列表 半斤八两于一个容器
context['blogs'] = page_blogs
return render(request, "home.html", context)
- 3
这里我们利用了django的Paginator,
用法:Paginator(数据列表,每页中含几多数据)
之后,我们再次打开网页127.0.0.1:8000,会发现页面只显示了10篇文章!我们在网址上输入http://127.0.0.1:8000/?page=2,当作功了!
再次点窜views视图
- 1
这里为了结果加倍较着,我点窜了paginator = Paginator(blogs, 2),每一页中只含两篇文章!
- 2
from django.shortcuts import render
from blog.models import Blog
from django.core.paginator import Paginator
def home(request):
context = {}
blogs = Blog.objects.all()
paginator = Paginator(blogs, 2) # 每2份内容分页一次
page_num = request.GET.get('page',1) # 获取url参数,127.0.0.1:8000/?page=<value>
# 不法数值则返回1 数值为空也返回1 如 127.0.0.1:8000/?page=asdsa
page_blogs = paginator.get_page(page_num) #获取当前(页码)所需要的文章列表 半斤八两于一个容器
page_list = [x for x in range(page_blogs.number -2, page_blogs.number + 3 )if x in paginator.page_range]
print(page_list)
# 添加省略号
if page_list[0] -1 >= 2: # 判定当前第一个元素减1是否年夜于2
page_list.insert(0, "...") # 则插入该数构成为第一个元素 ...
if paginator.num_pages - page_list[-1] >= 2: # 判定最年夜页码数-最后一个元素相减是否年夜于2
page_list.append("...") # 则添加一个元素
print(page_list)
#添加首从头至尾页
if page_list[0] == "...":
page_list.insert(0, 1) # 则插入该数构成为第一个元素(首页)
if page_list[-1] != paginator.num_pages: # 判定是否不等于最年夜页码
page_list.append(paginator.num_pages) # 不等于则插入到最后一个元素(从头至尾页)
print(page_list)
context['blogs'] = page_blogs
context['page_list'] = page_list
return render(request, "home.html", context)
# paginator.num_pages 总共有几多页码
# paginator.page_range 页码规模 如 (1,7)
# page_list 页码列表规模
- 3
这里的
page_list = [x for x in range(page_of_blogs.number -2, page_of_blogs.number + 3 )if x in paginator.page_range]
我利用了列表生当作式,如许可以避免超出页码规模或呈现页码数为负数的环境,别的我把page_list页码列表规模传出去,如许就可以在模板中利用了!别的添加了首从头至尾页以及省略号!之后就是在模板中利用了!
点窜模板home.html
- 1
这里我利用的是bootstrap的分页组件!在head头部记得引入css!
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
- 2
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div>
{% for blog in blogs %}
<p>{{ blog.title }}</p>
<p>{{ blog.content }}</p>
<hr>
{% endfor%}
</div>
<div>
<ul>
<li>
{% if blog_list.has_previous %}{# 是否上一页 #}
<a href="?page={{ blog_list }}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
{% else %}
<span aria-hidden="true">«</span>
{% endif%}
</li>
{# 全数页码 #}
{% for page_list in page_list %}
{% if page_list == blogs.number %}{# 判定是否当前页 是则高亮 #}
<li><span>{{ page_list }}</span></li>
{% else %}
{% if page_list == '...' %}
<li><span>{{ page_list }}</span></li>
{% else %}
<li><a href="?page={{ page_list }}">{{ page_list }}</a></li>
{% endif %}
{% endif %}
{% endfor %}
<li>
{% if page_list.has_next %}
<a href="#" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
{% else %}
<span aria-hidden="true">»</span>
{% endif %}
</li>
</ul>
</div>
</body>
</html>
- 3
context['blogs'] = page_blogs
context['page_list'] = page_list
page_list.has_previous 是否有上一页
page_list.has_next 是否有下一页
blogs.number 当前页码数 半斤八两于-> page_blogs.number
- 4
这里我利用了django的模板,for轮回,前提if,一般都用{% 前提 %},变量则利用{{ 变量名 }},
- 5
若是想要让分页器在网页上居中,可以在div标签上添加:
<div align="center"></div>即可实现居中结果
最终结果:
注重事项
- 注重要在setting.py里在INSTALLED_APPS添加你的APP进去!
- 若是是第一次建立项目,先利用python manage.py migrate进行迁徙
来源:百闻(微信/QQ号:9397569),转载请保留出处和链接!
本文链接:https://www.ibaiwen.com/web/224813.html
- 热门文章
-
WB蒙特利尔(WB Montreal)——欧美十大最差视频游戏开发商
迅猛龙(Velociraptor)——欧美史前十大死亡动物
什么是果酱猫(What Marmalade Cats)?
神奇蜘蛛侠2(The Amazing Spider-Man 2)——欧美最佳蜘蛛侠电影
希瑟(Heather)——欧美十大最佳柯南灰歌
二人梭哈
奥兹奥斯本(Ozzy Osbourne)——欧美十大高估歌手
faceu激萌怎么把瘦脸开到最大
什么是小脑前下动脉(Anterior Inferior Cerebellar Artery)?
我应该知道康涅狄格州的什么(What Should I Know About Connecticut)?
- 热评文章
- 最新评论
-
- 最近访客
-
- 站点信息
-
- 文章总数:200248
- 页面总数:9
- 分类总数:1
- 标签总数:0
- 评论总数:0
- 浏览总数:497