专栏首页菲宇Django中ListView分页技术

Django中ListView分页技术

Django中分页非常方便,通过Pagination你可以很方便达到分页效果。今天主要说的是基础视图中ListView的分页处理,本质还是依赖与Pagination。

数据模型:models.py

    from django.db import models
    from django.contrib.auth.models import User
    # Create your models here.
    class Msg(models.Model):
        title = models.CharField(max_length = 30)
        content = models.TextField()
        user = models.ForeignKey(User)
        ip = models.IPAddressField()
        datetime = models.DateTimeField(auto_now_add = True)
        click_count = models.IntegerField(default = 0)

views.py

 from django.views.generic import ListView
 from msg_board.models import Msg
 ITEMS_PER_PAGE = 1
          
 class MsgList(ListView):
     model = Msg#数据模型
     context_object_name = 'msg_list'#模板中变量
     template_name = 'index.html'#模板文件
     paginate_by = ITEMS_PER_PAGE#一个页面显示的条目

urls.py

urlpatterns = [ 
    re_path(r'^list/(?P<pk>[0-9]+)$', views.MsgListView.as_view(), ),
]

模板:index.html

<html>
    <head><title>msg_board</title>
    <style type="text/css">
    table{border:3 solid black; border-collapse:collapse}
    table th, table td{border:2 solid black}
    </style>
     
    </head>
    <body>
    <h3>Message:</h3>
    {% if msg_list %}
        <table id = "msgs">
            <tr>
                <th>Title</th>
                <th>Content</th>
                <th>Author</th>
                <th>Ip</th>
                <th>Time</th>
                <th>Click</th>
            </tr>
        {%for msg in msg_list %}
            <tr>
                <td>{{msg.title}}</td>
                <td>{{msg.content}}</td>
                <td>{{msg.user}}</td>
                <td>{{msg.ip}}</td>
                <td>{{msg.datetime}}</td>
                <td>{{msg.click_count}}</td>
            </tr>
        {% endfor%}
        </table>
        {% if is_paginated %}
        <div class="pagination">
            <span class="page-links">
                {% if page_obj.has_previous %}
                    <a href="/mysite?page={{ page_obj.previous_page_number }}">上一页</a>
                {% endif %}
                {% if page_obj.has_next %}
                    <a href="/mysite?page={{ page_obj.next_page_number }}">下一页</a>
                {% endif %}
                <span class="page-current">
                    第{{ page_obj.number }}页 ,工{{ page_obj.paginator.num_pages }}页。
                </span>
            </span>
        </div>
        {%endif%}
    {% else %}
    <p>No msgs !!!</p>
    {% endif %}
    </body>
    </html>
或者
<html>
    <head><title>msg_board</title>
    <style type="text/css">
    table{border:3 solid black; border-collapse:collapse}
    table th, table td{border:2 solid black}
    </style>
     
    </head>
    <body>
    <h3>Message:</h3>
    {% if msg_list %}
        <table id = "msgs">
            <tr>
                <th>Title</th>
                <th>Content</th>
                <th>Author</th>
                <th>Ip</th>
                <th>Time</th>
                <th>Click</th>
            </tr>
        {%for msg in msg_list %}
            <tr>
                <td>{{msg.title}}</td>
                <td>{{msg.content}}</td>
                <td>{{msg.user}}</td>
                <td>{{msg.ip}}</td>
                <td>{{msg.datetime}}</td>
                <td>{{msg.click_count}}</td>
            </tr>
        {% endfor%}
        </table>

{% if is_paginated %}
                    <nav aria-label="...">
                        <ul class="pagination justify-content-center">
                            {% if page_obj.has_previous %}
                            <li class="page-item ">
                                <a class="page-link" href="{{ request.path }}?page=1" tabindex="-1" aria-label="Previous">
                                <span aria-hidden="true"  >&laquo;</span>
                                <span class="sr-only">Previous</span>
                                </a>
                            </li>
                            {% else %}
                            <li class="page-item disabled">
                                <a  class="page-link" href="{{ request.path }}?page=1" > <span aria-hidden="true">&laquo;</span></a>
                            </li>
                            {% endif %}
                            {% for i in page_obj.paginator.page_range %}
                                {% if page_obj.number == i %}
                                    <li class="page-item active">
                                        <a class="page-link"  href="{{ request.path }}?age={{ i }}">{{ i }}</a>
                                    </li>
                                {% else %}
                                    <li class="page-item">
                                        <a class="page-link"  href="{{ request.path }}?page={{ i }}">{{ i }}</a>
                                    </li>
                                {% endif %}
                            {% endfor %}
                            <li class="page-item">
                                <a  class="page-link"> 共{{ page_obj.paginator.num_pages }}页</a>
                            </li>
                            {% if page_obj.has_next %}
                        <li class="page-item">
                            <a class="page-link"  href="{{ request.path }}?page={{ page_obj.next_page_number }}"><span aria-hidden="true">&raquo;</span></a></li>
                        {% else %}
                        <li class="page-item" aria-label="Next">
                            <a  class="page-link"> <span aria-hidden="true"  >&raquo;</span></a>
                        <span class="sr-only">Next</span>
                        </li>
                        {% endif %}
                        </ul>
                    </nav>
                {%endif%}
    {% else %}
    <p>No msgs !!!</p>
    {% endif %}
    </body>
    </html>

效果图:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 利用jieba和wordcloud从新闻中生成词云

    wordcloud 是一个python实现的高效词频可视化工具,除了可以使用各种mask和颜色提供个性化的掩膜,还可以通过api便捷的挑战获得个性化的词云输出。...

    菲宇
  • Django之分页组件和自定义分页

    Django提供了一个新的类来帮助你管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表、元组或其它可迭代的对象。

    菲宇
  • Django-pure-pagination的使用

    Django自带有分页的两个类,但是用起来没有第三方这个分页模块方便,下面介绍一下django-pure-pagination使用方法。该库基于django.c...

    菲宇
  • mako模板+django+分页

    遇到的问题:我看网上html页面大家通过page2.next_page_number和page2.preivous_page_number获取上一页和下一页的页...

    用户1171305
  • 在ASP.NET MVC中使用“RadioButtonList”和“CheckBoxList”

    在《为HtmlHelper添加一个RadioButtonList扩展方法》中我通过对HtmlHelper和HtmlHelper<Model>的扩展使我们可以采用...

    蒋金楠
  • 清华x-lab区块链公开课报名 | 信用科技与普惠金融的最强引擎

    大数据文摘
  • Asp.net Ajax CascadingDropDown 控件的用法

      CascadingDropDown 控件提供了级联下拉列表显示的功能。在一些特定的业务环境下,我们希望下拉列表会根据页面中的另外一个控件(TextBox、C...

    thz
  • python 的http请求模块 url

    urllib3是一个强大的,理智的友好的HTTP客户端程序。大部分的Python的生态系统已经使用,你也应该urllib3。urllib3带来从Python标准...

    用户2398817
  • C++中巧妙的位运算

    位运算要多想到与预算和异或运算,并常常将两个数对应位上相同和不同分开处理 一、x&(x-1)消除x二进制中最右边的一个1。 这个比较厉害,比如统计某个 二、与和...

    用户1215536
  • 清华x-lab区块链公开课报名 | 分布科技李俊:区块链与信任社会

    大数据文摘

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动