gpt4 book ai didi

Django pdf 导出

转载 作者:行者123 更新时间:2023-12-02 06:42:00 32 4
gpt4 key购买 nike

我想生成一个 PDF,它将以表格格式显示查询集的输出,例如:

query = ModelA.objects.filter(p_id=100)

class ModelA(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200)
p_id = models.IntegerField()
description = models.TextField()

我需要在生成的 PDF 中显示 namedescriptionpid 的值。

最佳答案

正如其他人提到的,最好的方法是生成一个模板,然后使用周围的众多库之一将结果转换为 PDF。此方法为您提供了对模板的通常控制量,例如使用标签。

我使用了前面提到的 ReportLab/Pisa 设置,但发现它相当有限,大多数布局必须使用表格构建,并且 CSS2 规范的许多部分尚未实现。

一个更易于使用的库是 wkhtmltopdf这是 WebKit 的 headless 发行版。这样做的好处是可以像任何 webkit 浏览器一样渲染您的模板,从而让您可以使用 webkit 特定的附加功能,例如 WebKit 中存在的 CSS3 规范的一部分。

使用包装器库 django-wkhtmltopdf您可以在 View 中使用 render_to_pdf 而不是通常的 Django render_to_response

免责声明:我是该库的贡献者。

更新

该库已转换为 CBV,为了方便起见,下面的大部分信息(我将保留这些信息以帮助添加一些上下文)现在已在库本身中实现。

请参阅quickstart文档中有关如何实现以下代码块的示例。如果您需要使用更高级的用法,您可以子类化 PDFTemplateView 并添加各种选项,例如文件名和边距。

示例 View :

from django.shortcuts import render_to_response
from wkhtmltopdf import render_to_pdf

def pdf(request):
context.update({'objects': ModelA.objects.filter(p_id=100)})

kwargs = {}
if request.GET and request.GET.get('as', '') == 'html':
render_to = render_to_response
else:
render_to = render_to_pdf
kwargs.update(dict(
filename='model-a.pdf',
margin_top=0,
margin_right=0,
margin_bottom=0,
margin_left=0))

return render_to('pdf.html', context, **kwargs)

这里的条件语句允许您将 ?as=html 传递给 View ,以便您可以在浏览器中进行开发。目前这样做有点丑陋,但计划很快在版本中修复此问题。

使用此 View ,您可以像平常一样在 View 中循环对象的内容,甚至可以扩展基本模板。我通常专门为 PDF 使用不同的样式表,以实现样式的可维护性和可读性,因为您需要对 PDF 做一些不同的事情,例如如果您想将页脚 block 保留在同一位置,则设置最小高度.

在此说明中,您可以创建将在 PDF 的每个页面上使用的页眉和页脚模板,方法是将它们作为 kwargs 的一部分传递到 render_to_pdf。

关于Django pdf 导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7821087/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com