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

Django模板中使用slice变量实现PDF图片分页显示的语法问题

解决Django模板中PDF分页显示图片的问题

首先,你直接在slice过滤器里写page*12:page*12+12是行不通的——Django模板的slice参数是字符串,不会自动解析其中的变量和算术运算。下面给你两种可行方案,优先推荐第一种更规范的实现:

方案一:在视图层用Django Paginator处理分页(最优)

把分页逻辑放在视图里,模板只负责渲染,符合MVC的职责划分,代码更易维护:

视图代码示例

from django.core.paginator import Paginator
from django.shortcuts import render

def generate_pdf_view(request):
    # 假设你从数据库获取图片列表
    project_images = YourImageModel.objects.all()
    # 初始化分页器,每页12张图片
    paginator = Paginator(project_images, 12)
    # 获取所有页码对应的分页对象(包含该页的图片列表)
    page_objects = [paginator.page(page_num) for page_num in paginator.page_range]
    
    return render(request, 'your_pdf_template.html', {
        'page_objects': page_objects,
        'base_url': request.build_absolute_uri('/')
    })

模板代码修改

{% for page in page_objects %}
    <!-- 第一页不需要前置分页符 -->
    {% if not forloop.first %}
        <p style="page-break-before: always"></p>
    {% endif %}
    <div class="img-wrapper">
        {% for image in page.object_list %}
             <div class="img-box" style="margin: 5px">
                <img
                  class="report-img"
                  src="{{ base_url }}{{ image.path.url }}"
                />
             </div>
        {% endfor %}
    </div>
{% endfor %}

方案二:自定义模板过滤器实现动态切片

如果不想改动视图逻辑,可以自定义一个模板过滤器,用来计算每页的图片范围:

1. 创建自定义过滤器

在你的Django应用下新建templatetags/pagination_tags.py文件:

from django import template

register = template.Library()

@register.filter
def paginate_images(image_list, page_num):
    # 页码从1开始的话,起始索引是(page_num-1)*12
    start_idx = (int(page_num) - 1) * 12
    end_idx = start_idx + 12
    return image_list[start_idx:end_idx]

2. 模板中使用过滤器

<!-- 先加载自定义过滤器 -->
{% load pagination_tags %}

{% for page_num in image_pages %}
    {% if not forloop.first %}
        <p style="page-break-before: always"></p>
    {% endif %}
    <div class="img-wrapper">
        <!-- 用自定义过滤器获取当前页的图片 -->
        {% for image in project_images|paginate_images:page_num %}
             <div class="img-box" style="margin: 5px">
                <img
                  class="report-img"
                  src="{{ base_url }}{{ image.path.url }}"
                />
             </div>
        {% endfor %}
    </div>
{% endfor %}

注意:如果你的image_pages是从0开始的索引(而非页码),只需把过滤器里的(int(page_num)-1)*12改成int(page_num)*12即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:10:37