如何在Django模板中依次展示多组数据并自定义页码?
Django模板自定义多组数据打印页码实现方案
核心思路
要实现多组数据对应自定义连续页码,需要在视图层先完成数据分页与页码起始值计算,再在模板层结合分页数据渲染对应页码,同时用CSS控制打印时的分页逻辑。
1. 视图层处理(计算分页与起始页码)
用Django内置的Paginator对两组数据分别分页,同时计算第二组数据的起始页码(第一组总页数+1),最后将分页对象和起始页码传入模板上下文。
from django.core.paginator import Paginator from django.shortcuts import render def your_view(request): # 替换为实际业务中获取balances、price数据的逻辑 balances = ... price_list = ... # 注意变量名避开模板循环变量,避免冲突 # 配置每页显示条数(根据实际需求调整) per_page = 1 # 对两组数据分别分页 balance_paginator = Paginator(balances, per_page) price_paginator = Paginator(price_list, per_page) # 定义每组数据的起始页码 balance_start_page = 1 price_start_page = balance_paginator.num_pages + 1 # 接在balances的页码之后 context = { 'balance_paginator': balance_paginator, 'price_paginator': price_paginator, 'balance_start_page': balance_start_page, 'price_start_page': price_start_page, } return render(request, 'your_template.html', context)
2. 模板层渲染(显示自定义页码+控制打印分页)
通过遍历分页对象的页码范围,渲染每页数据并计算当前自定义页码,同时用CSS的page-break-after控制打印时每页自动断开。
<style> /* 打印时的分页样式 */ @media print { .print-page { page-break-after: always; } /* 最后一页不需要分页符 */ .print-page:last-child { page-break-after: avoid; } } </style> <!-- 渲染balances数据,对应页码1-4 --> {% for page_num in balance_paginator.page_range %} <div class="print-page"> <p>当前页码: {{ balance_start_page | add:page_num | add:-1 }}</p> {% for balance in balance_paginator.page(page_num) %} <p>{{ balance.amount }}</p> {% endfor %} </div> {% endfor %} <!-- 渲染price数据,对应页码5-7 --> {% for page_num in price_paginator.page_range %} <div class="print-page"> <p>当前页码: {{ price_start_page | add:page_num | add:-1 }}</p> {% for price in price_paginator.page(page_num) %} <p>{{ price.amount }}</p> {% endfor %} </div> {% endfor %}
关键注意点
- 变量名冲突:原代码中
price同时作为数据集变量和循环变量,建议重命名数据集为price_list避免混淆; - 页码计算:
page_num从1开始,所以需要用起始页码 + page_num -1得到正确的自定义页码; - 分页灵活性:如果需要调整每页显示条数,只需要修改视图中的
per_page参数即可。
内容的提问来源于stack exchange,提问作者Anoop
相关产品推荐
相关产品推荐

