Django学习(五)优雅地分页展示网页

简介:        在我们平时浏览网页时,经常会遇到网页里条目很多的情形,这时就会用到分页展示的功能。那么,在Django中,是如何实现网页分类的功能的呢?答案是Paginator类。

       在我们平时浏览网页时,经常会遇到网页里条目很多的情形,这时就会用到分页展示的功能。那么,在Django中,是如何实现网页分类的功能的呢?答案是Paginator类。

       本次分享讲具体展示如何利用Django的Paginator类来实现网页的分页展示功能。

       首先我们要展示的内容是159首陶渊明的诗歌,它们储存在'/home/vagrant/poem.txt'文件中。

       默认的不分页的网页(page.html)如下:


         其模板的代码如下:

<ul>
{% for contact in contacts %}
<li>{{contact}}<br><br></li>
{% endfor %}
</ul>

<div>
<center>
{% if contacts.has_previous %}  
<a href="?page={{ contacts.previous_page_number }}"> 上一页</a>  
{% endif %}  
<span>  
    {% for p in contacts.paginator.page_range %}  
    {% ifequal p contacts.number %}  
    <span class="current">{{p}}</span>  
	{% else %}  
	<a href="?page={{p}}" title="第{{p}}页"><button>{{p}}</button></a>  
	{% endifequal %}
    {% endfor %}  
</span>  
{% if contacts.has_next %}  
<a href="?page={{ contacts.next_page_number }}">下一页 > </a>  
{% endif %}  
<a>[page:{{ contacts.number }}/{{ contacts.paginator.num_pages }}]</a>
</center> 
</div> 

<br>
<form action="/fenye/" method="get">
	<center>
	<select name='items'>
		<option value='10' checked="checked">10 items each page</option>
		<option value='15'>15  items each page</option>
		<option value='20'>20  items each page</option>
	</select>
	<input type="submit" value="select">
	</center>     
</form>
该网页中的数字按钮可连接到对应的页码,当然也可以用‘下一页’链接。也可以自由选择每页需要显示的条目数量,如下:


选择好条目数,在点击select按钮,可链接到如下页面:


           这个页面(fenye.html)显示每页10条,可以点击按钮‘Return To Original Page’回到刚才的页面(page.html)。该页面(fenye.html)的模板代码如下:

<ul>
{% for contact in contacts %}
<li>{{contact}}<br><br></li>
{% endfor %}
</ul>

<div>
<center>
{% if contacts.has_previous %}  
<a href="?page={{ contacts.previous_page_number }}"> 上一页</a>  
{% endif %}  
<span>  
    {% for p in contacts.paginator.page_range %}  
    {% ifequal p contacts.number %}  
    <span class="current">{{p}}</span>  
	{% else %}  
	<a href="?page={{p}}" title="第{{p}}页"><button>{{p}}</button></a>  
	{% endifequal %}
    {% endfor %}  
</span>  
{% if contacts.has_next %}  
<a href="?page={{ contacts.next_page_number }}">下一页 > </a>  
{% endif %}  
<a>[page:{{ contacts.number }}/{{ contacts.paginator.num_pages }}]</a>
</center> 
</div> 
<center>
	<br>
    <button onclick="window.location.href='http://localhost:8000/page'">Return To Original Page</button>
</center>
           最后,我们的后端views.py代码如下:

from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.utils.datastructures import MultiValueDictKeyError
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage

#show items in default 
def output(request):
    # get items show on the page from poems.txt
    with open('/home/vagrant/poems.txt', 'r') as f:
        text = f.readlines()
		
    items_each_page = 15  # how many items in each page
    paginator = Paginator(text, items_each_page)
    page = request.GET.get('page')  # get 'page'
    try:
        contacts = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        contacts = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        contacts = paginator.page(paginator.num_pages)
    return render_to_response('page.html',{'contacts': contacts})

#show items by your choice
def output2(request):
    with open('/home/vagrant/poems.txt', 'r') as f:
        text = f.readlines()
		
    try:
        #try to get 'items', if None or failed, do nothing.
        a = request.GET.get('items')
        if str(a) != 'None':
            with open('/home/vagrant/num.txt', 'w') as f:
                f.write(a)
    except:
        pass

    with open('/home/vagrant/num.txt','r') as f:
        items_each_page = int(f.read())

    paginator = Paginator(text, items_each_page)
    page = request.GET.get('page')
    try:
        contacts = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        contacts = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        contacts = paginator.page(paginator.num_pages)	
    return render_to_response('fenye.html',{'contacts': contacts})
       这样,我们就基本实现了在Django中网页分页展示的功能,而且能够自己选择每一页需要展示的条目的数量,这显然是非常方便使用的。

       本次分享到此结束,如有问题,欢迎大家交流与批评~~

目录
相关文章
|
2月前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
99 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
2月前
|
SQL Java 数据库
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
这篇文章是关于如何使用Django框架的ORM系统在视图(views)层面进行数据库的增、删、改、查操作的教程。
24 0
Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。
|
2月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
87 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
3月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
123 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
6月前
|
编解码 前端开发 JavaScript
技术经验分享:Django学习日记
技术经验分享:Django学习日记
|
3月前
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
93 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
|
4月前
|
前端开发 关系型数据库 Python
Django入门到放弃之分页器
Django入门到放弃之分页器
|
4月前
|
安全 中间件 项目管理
Django 后端架构开发:分页器到中间件开发
Django 后端架构开发:分页器到中间件开发
48 1
|
5月前
|
开发者 Python
Django如何开发网页四
7月更文挑战第21天
|
5月前
|
缓存 前端开发 数据库
Django如何开发网页一
7月更文挑战第19天