Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何使用一个页面模板从reportlab创建两个页面?_Django_Django Admin_Reportlab - Fatal编程技术网

Django 如何使用一个页面模板从reportlab创建两个页面?

Django 如何使用一个页面模板从reportlab创建两个页面?,django,django-admin,reportlab,Django,Django Admin,Reportlab,大家好,实验室主任 我在网上搜索过,也在stackoverflow中搜索过,但在我的问题上找不到类似的情况,我正试图在这个假期解决这个问题 在django admin中,我试图创建一个操作以特定格式查看我的数据库。如果我选择一条记录,我可以查看一页pdf格式的报告。这很好。如果用户试图进行更多记录,那么问题就从这里开始。例如,我选择了多条记录,我可以查看报告,但所有内容仍在一页pdf中 有没有办法以pdf格式显示每页的记录?所有的报告实验室绝地大师,请帮助我如何正确地做到这一点 这是我所做的代码

大家好,实验室主任

我在网上搜索过,也在stackoverflow中搜索过,但在我的问题上找不到类似的情况,我正试图在这个假期解决这个问题

在django admin中,我试图创建一个操作以特定格式查看我的数据库。如果我选择一条记录,我可以查看一页pdf格式的报告。这很好。如果用户试图进行更多记录,那么问题就从这里开始。例如,我选择了多条记录,我可以查看报告,但所有内容仍在一页pdf中

有没有办法以pdf格式显示每页的记录?所有的报告实验室绝地大师,请帮助我如何正确地做到这一点

这是我所做的代码

from django.contrib import admin
from models import LatestRsl    
from io import BytesIO
from reportlab.pdfgen import canvas
from django.http import HttpResponse


try:
from cStringIO import StringIO
    except ImportError:
from StringIO import StringIO

from reportlab.lib.units import inch
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import BaseDocTemplate, PageTemplate, Paragraph, Frame
from reportlab.lib.pagesizes import letter

def go(modeladmin, request, queryset):
    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'filename = testframe.pdf'

    buffer = StringIO()
    c = canvas.Canvas(buffer)
    doc = BaseDocTemplate(buffer, showBoundary=1, leftMargin= 0.1*inch, rightMargin= 0.1*inch,
                     topMargin= 0.1*inch, bottomMargin= 0.1*inch)

    signfr = Frame(5.1*inch, 1.2*inch, 2.8*inch, 0.44*inch, showBoundary=1)
    modelfr = Frame(3.6*inch, 4.6*inch, 2.8*inch, 0.44*inch, showBoundary=1)
    doc.addPageTemplates([PageTemplate(id= 'rsl_frame', frames=[signfr, modelfr]),
                         PageTemplate(id= 'rsl_frame2', frames=[signfr, modelfr])])

    story = []

    styles=getSampleStyleSheet()
        styles.add(ParagraphStyle(name='Verdana9', fontName= 'Verdana', fontSize= 9))
        styles.add(ParagraphStyle(name='VerdanaB10', fontName= 'VerdanaB', fontSize= 10))

    for obj in queryset:
        #1st frame
        model = Paragraph(obj.make,styles["Verdana9"])
        story.append(model)
        modelfr.addFromList(story,c)

        #2nd frame
        signatory = Paragraph(obj.signatory,styles["VerdanaB10"])
        story.append(signatory)
        signfr.addFromList(story,c)

    doc.build(story)
    c.showPage()
    c.save()
    pdf = buffer.getvalue()
    buffer.close()
    response.write(pdf)
return response

假设
queryset
变量包含所需的所有记录,则可以插入
PageBreak
对象。只需将reportlab.platypus import PageBreak中的
添加到文件的顶部,然后将
PageBreak
对象附加到文档的元素中

如果要更改每个页面的模板,还可以附加一个
NextPageTemplate
,并传递
PageTemplate
id
。您还需要将reportlab.platypus import NextPagetTemplate中的
添加到文件的顶部

for obj in queryset:
    #1st frame
    model = Paragraph(obj.make,styles["Verdana9"])
    story.append(model)
    modelfr.addFromList(story,c)

    #2nd frame
    signatory = Paragraph(obj.signatory,styles["VerdanaB10"])
    story.append(signatory)
    signfr.addFromList(story,c)

    # Force the report to use a different PageTemplate on the next page
    story.append(NextPageTemplate('rsl_frame2'))
    # Start a new page for the next object in the query
    story.append(PageBreak())

您可以将
PageBreak
移动到任何需要的地方,但这是一个简单的“函数”流程
NextPageTemplate
可以获取通过
addPageTemplates
添加的任何有效
PageTemplate
对象的
id
,您可以在故事中的段落之间插入page brake对象,以获得多页文档。