You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django如何对字典列表实现分页?每页显示10条数据

给Django视图实现分页功能(每页10条)

嘿,我来帮你搞定这个分页需求!Django自带了开箱即用的分页工具,咱们直接用它就行,不用自己手动处理分页逻辑。下面分两步修改你的代码:

第一步:修改views.py

首先需要导入Django的分页相关类,然后对获取到的dataList进行分页处理:

from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.shortcuts import render
import requests
import datetime

def get_questions(request):
    context = {}
    url = 'https://api.stackexchange.com/2.2/questions'
    params = {
        'fromdate':'1525858177',
        'todate':'1525904006',
        'order':'desc',
        'sort':'activity',
        'tagged':'python',
        'site':'stackoverflow'
    }
    r = requests.get(url, params=params).json()
    dataList = []
    for item in r['items']:
        dataList.append({
            'owner': item['owner']['display_name'],
            'title': item['title'],
            'creation_date': datetime.datetime.fromtimestamp(float(item['creation_date'])),
            'is_answered': item['is_answered'],
            'view_count': item['view_count'],
            'score':item['score'],
            'link':item['link'],
            'answer_count':item['answer_count']
        })
    
    # 新增分页逻辑:每页10条
    paginator = Paginator(dataList, 10)
    page = request.GET.get('page')  # 获取当前页码,从URL的?page=参数中获取
    
    try:
        paginated_data = paginator.page(page)
    except PageNotAnInteger:
        # 如果页码不是整数,默认显示第一页
        paginated_data = paginator.page(1)
    except EmptyPage:
        # 如果页码超出范围,显示最后一页
        paginated_data = paginator.page(paginator.num_pages)
    
    context['data'] = paginated_data  # 把分页后的对象传给模板
    template = 'questions/questions_list.html'
    return render(request,template,context)

第二步:修改模板questions_list.html

在表格的下方添加分页导航栏,这里用Bootstrap的分页样式(和你原模板的表格样式匹配):

<table id="myTable" class="table table-hover">
    <thead>
        <tr>
            <th scope="col">Owner</th>
            <th scope="col">Title</th>
            <th scope="col">Creation date</th>
            <th scope="col">Is answered</th>
            <th scope="col">View count</th>
            <th scope="col">Score</th>
        </tr>
    </thead>
    <tbody>
        {% for d in data %}
        <tr>
            <td>{{ d.owner }}</td>
            <td><a href="{{ d.link }}" target="_blank">{{ d.title }}</a></td>
            <td>{{ d.creation_date }}</td>
            <td>{{ d.is_answered|yesno:"yes,no" }}</td>
            <td>{{ d.view_count }}</td>
            <td>{{ d.score }}</td>
        </tr>
        {% endfor %}
    </tbody>
</table>

<!-- 新增分页导航 -->
<nav aria-label="Page navigation">
    <ul class="pagination justify-content-center">
        <!-- 上一页按钮 -->
        {% if data.has_previous %}
        <li class="page-item">
            <a class="page-link" href="?page={{ data.previous_page_number }}" aria-label="Previous">
                <span aria-hidden="true">&laquo;</span>
            </a>
        </li>
        {% else %}
        <li class="page-item disabled">
            <span class="page-link">&laquo;</span>
        </li>
        {% endif %}

        <!-- 页码按钮 -->
        {% for num in data.paginator.page_range %}
            {% if data.number == num %}
            <li class="page-item active"><span class="page-link">{{ num }} <span class="sr-only">(current)</span></span></li>
            {% else %}
            <li class="page-item"><a class="page-link" href="?page={{ num }}">{{ num }}</a></li>
            {% endif %}
        {% endfor %}

        <!-- 下一页按钮 -->
        {% if data.has_next %}
        <li class="page-item">
            <a class="page-link" href="?page={{ data.next_page_number }}" aria-label="Next">
                <span aria-hidden="true">&raquo;</span>
            </a>
        </li>
        {% else %}
        <li class="page-item disabled">
            <span class="page-link">&raquo;</span>
        </li>
        {% endif %}
    </ul>
</nav>

小补充说明:

  1. 视图里的Paginator会自动把你的数据按每页10条拆分,通过URL的?page=页码参数就能切换不同页面。
  2. 模板里的分页导航会智能判断是否显示上一页/下一页按钮,当前页码会自动高亮,交互体验很友好。
  3. 我把原模板里的target="blank"改成了标准的target="_blank",这是HTML的规范写法哦。

内容的提问来源于stack exchange,提问作者Danae Vogiatzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:56:39