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">«</span> </a> </li> {% else %} <li class="page-item disabled"> <span class="page-link">«</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">»</span> </a> </li> {% else %} <li class="page-item disabled"> <span class="page-link">»</span> </li> {% endif %} </ul> </nav>
小补充说明:
- 视图里的
Paginator会自动把你的数据按每页10条拆分,通过URL的?page=页码参数就能切换不同页面。 - 模板里的分页导航会智能判断是否显示上一页/下一页按钮,当前页码会自动高亮,交互体验很友好。
- 我把原模板里的
target="blank"改成了标准的target="_blank",这是HTML的规范写法哦。
内容的提问来源于stack exchange,提问作者Danae Vogiatzi
相关产品推荐
相关产品推荐

