Django-page 分页

class ArticleListView(ListView):
    model = Article
    template_name = 'article_list.html'
    paginate_by = 20
    context_object_name = 'articles'
    ordering = 'create_time'
    page_kwarg = 'p'
    def get_context_data(self,**kwargs):
        #要获取上下文的数据 需要继承于父类
        context = super(ArticleListView,self).get_context_data(*kwargs)
        print("="*30)
        print(context)
        print("=" * 30)
        paginator = context.get('paginator') #获取context中的 paginator
        print(paginator.count) #151条数据
        print(paginator.num_pages) #8 分 8页
        print(paginator.page_range) #range(1, 9) 包含第一页 不包含第九页

Paginator常用属性和方法:

count:总共有多少条数据。

num_pages:总共有多少页。

page_range:页面的区间。比如有三页,那么就range(1,4)。

class ArticleListView(ListView):
    model = Article
    template_name = 'article_list.html'
    paginate_by = 20
    context_object_name = 'articles'
    ordering = 'create_time'
    page_kwarg = 'p'
    def get_context_data(self,**kwargs):
        #要获取上下文的数据 需要继承于父类
        context = super(ArticleListView,self).get_context_data(*kwargs)
        page_obj = context.get('page_obj')  从 context 中 获取 page_obj
        #http://127.0.0.1:9000/article/list/?p=7
        print(page_obj.has_next()) 是否还有下一页  True
        print(page_obj.has_previous()) 是否还有上一页 True
        print(page_obj.next_page_number()) 下一页的页码  8 

Page常用属性和方法:

has_next:是否还有下一页。
has_previous:是否还有上一页。
next_page_number:下一页的页码。
previous_page_number:上一页的页码。
number:当前页。
start_index:当前这一页的第一条数据的索引值。
end_index:当前这一页的最后一条数据的索引值。

html外链
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<table border="1" cellpadding="1" cellspacing="0">
    <tr>
        <th>序号</th>
        <th>标题</th>
        <th>内容</th>
        <th>创建时间</th>
    </tr>
    {% for article in articles %}
     <tr>
        <td>{{ article.id }}</td>
        <td>{{ article.title }}</td>
        <td>{{ article.context }}</td>
        <td>{{ article.create_time }}</td>
     </tr>
    {% endfor %}
​
</table>
    <nav aria-label="Page navigation ">
        <ul class="pagination ">
            {% if page_obj.has_previous %}
                <li><a href="{% url 'article_list' %}?page={{                                       page_obj.previous_page_number }}">上一页</a></li>
            {% else %}
                <li><a href="javascript:void(0)">上一页</a></li>
            {% endif %}
             {# 中间的页码#}
            {% for page in paginator.page_range %}
                {% if page == page_obj.number %}
                    <li class="active"><a href="javascript:void(0)">{{ page }}</a></li>
                {% else %}
                    <li><a href="{% url 'article_list' %}?page={{ page }}">{{ page }}</a></li>
​
                {% endif %}
            {% endfor %}
             {% if page_obj.has_next %}
                <li><a href="{% url 'article_list' %}?page={{                                       page_obj.next_page_number }}">下一页</a></li>
            {% else %}
                <li><a href="javascript:void(0)">下一页</a></li>
            {% endif %}
​
​
​
        </ul>
    </nav>
</body>
</html>
### 如何在 Django REST framework 中使用分页 为了实现在 Django REST framework (DRF) 中的分页功能,可以按照如下方法进行设置: #### 配置全局分页选项 可以在项目的 `settings.py` 文件中指定默认的分页类以及每页显示的最大项数。这使得在整个应用程序范围内统一处理分页逻辑变得简单。 ```python # settings.py REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', 'PAGE_SIZE': 10, } ``` 上述配置选择了 `LimitOffsetPagination` 类作为默认分页机制,并设定了页面大小为 10 条记录[^3]。 对于更灵活的需求,还可以考虑其他类型的内置分页器如 `PageNumberPagination` 或者创建自定义分页器来满足特定场景下的要求[^5]。 #### 使用标准视图中的分页支持 当采用 DRF 提供的标准视图(例如基于类的通用视图或视图集)时,默认情况下会自动应用所设定好的分页行为;然而如果是通过普通的 APIView 实现,则需手动调用分页 API 才能获得相同效果。 下面是一个简单的例子展示了如何在一个列表视图里启用分页特性: ```python from rest_framework import generics from myapp.models import MyModel from myapp.serializers import MyModelSerializer class MyModelListView(generics.ListAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer ``` 在这个案例中,由于继承了 `generics.ListAPIView` ,因此无需额外编码即可享受已配置好分页带来的便利。 如果想要进一步定制化分页的表现形式,比如改变链接结构或是调整响应体的内容布局等,可以通过重写现有的分页器或者新建子类来自定义所需的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值