Django 简单分页

类似下面这种没有滚动的:
在这里插入图片描述
在这里插入图片描述

首先,创建一些数据:
在models.py中:

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=20)
    age = models.IntegerField()

在urls.py中:

path('add/', views.add),
    path('select/', views.select)
def add(request):
    for x in range(1, 101):
        name = '张三%s'%x
        age = 20 + x

        user = User(name=name, age=age)
        user.save()

    return HttpResponse('ok')


from django.core.paginator import Paginator, PageNotAnInteger, InvalidPage, EmptyPage
def select(request):
    # 1. 把需要分页的数据全部查询出来;
    user_list = User.objects.all()
    # 2. 利用user_list数据,创建一个分页器对象
    # 参数1:要分页的数据;参数2:设置每页要展示的数据个数;参数3:如果最后一页不到5个数据,是否将最后一页的数据合并到上一页进行展示;默认是False,不合并;
    paginator = Paginator(user_list, 5)
    # 3. 创建页面对象Page,每一个page对应的是每一个页面,这个page中包含:
    # page对象有三个属性:
    # a> page.number: 表示当前查询的页码;
    # b> page.object_list: 表示当前页要展示的数据;
    # c> page.paginator: 它就是上面创建的Paginator(user_list, 5)这个对象,无论是哪一页,这个paginator对象始终跟着Page对象;
    try:
        page_number = request.GET.get('page', '1')
        page = paginator.page(page_number)
    except (PageNotAnInteger, EmptyPage, InvalidPage):
        # 如果出现上述异常,默认展示第1页
        page = paginator.page(1)

    return render(request, 'index.html', {'page': page})

将page对象传入到HTML中,HTML的写法:

<nav aria-label="Page navigation">
        {% for data in page.object_list %}
            <p>{{ data.id }}-{{ data.name }}-{{ data.age }}</p>
        {% endfor %}
        <ul class="pagination">
            {% if page.has_previous %}
                {# page.has_previous: 判断当前页page是否含有上一页的属性 #}
                {# page.previous_page_number:上一页的页码 #}
                <li>
                    <a href="?page={{ page.previous_page_number }}" aria-label="Previous">
                        <span aria-hidden="true">上一页</span>
                    </a>
                </li>
            {% endif %}
            {# 每次点击页码,这20次循环都会从头开始循环。 #}
            {% for page_number in page.paginator.page_range %}
                {% if page_number == page.number %}
                    {# 如果当前查询的页码和循环的页码刚好相等 #}
                    <li class="active"><a href="?page={{ page_number }}">{{ page_number }}</a></li>
                {% else %}
                    <li><a href="?page={{ page_number }}">{{ page_number }}</a></li>
                {% endif %}
            {% endfor %}
            {% if page.has_next %}
                <li>
                    <a href="?page={{ page.next_page_number }}" aria-label="Previous">
                        <span aria-hidden="true">下一页</span>
                    </a>
                </li>
            {% endif %}
      </ul>
    </nav>

先执行/add/添加上数据,之后/select/就出现了要的结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhangmengran/article/details/84308840
今日推荐