django pdf 导出 [英] django pdf export

查看:21
本文介绍了django pdf 导出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to generate a PDF which will show the output of my queryset in table format, for example:

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 的值.

I need to show the values for name, description and pid in the generated PDF.

推荐答案

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

As mentioned by other people the best way to do this is to generate a template then convert the result, using one of the many libraries around, into a PDF. This method provides you with the usual amount of control over your templates, for example using tags.

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

I've used the previously mentioned ReportLab/Pisa setup but found it to be quite limiting, most layouts have to be built using tables and many parts of the CSS2 spec aren't implemented yet.

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

An easier to use library is wkhtmltopdf which is a headless distribution of WebKit. This has the benefit of rendering your templates like any webkit browser would and thus letting you use webkit specific extras, such as parts of the CSS3 spec that exist in WebKit.

使用包装库django-wkhtmltopdf,您可以render_to_pdf在您的视图中,而不是通常的 Django render_to_response.

Using the wrapper library django-wkhtmltopdf you can render_to_pdf in your view instead of the usual Django render_to_response.

免责声明:我是这个库的贡献者.

Disclaimer: I am a contributor to this library.

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

This library has been converted to CBVs and most of the information below (which I'll leave to help add some context) is now implemented in the library itself for convenience.

请参阅 快速入门 文档,了解如何操作的示例实现下面的代码块.如果您需要使用更高级的用法,您可以子类化 PDFTemplateView 并添加各种选项,如文件名和边距.

See the quickstart docs for an example of how to implement the below code block. If you need to use more advanced usage you can subclass PDFTemplateView and add various options like filename and the margins.

示例视图:

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 传递给视图,以便您可以在浏览器中进行开发.目前这样做有点丑陋,但我们计划很快在发布版本中修复此问题.

The conditional statement here lets you pass ?as=html to the view so you can develop in the browser. It's a bit of an ugly way to do it currently but there are plans to fix this in a release soon.

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

Using this view you could loop the contents of objects in your view as you would normally and even extend your base template. I've normally used a different stylesheet specifically for the PDFs for maintainability and readability of the styles as you need to do a few things differently for PDFs, such as setting a min-height if you want to keep your footer block in the same place.

在此说明中,您可以通过将页眉和页脚模板作为 kwargs 的一部分传递给 render_to_pdf 来创建将在 PDF 的每一页上使用的页眉和页脚模板.

On this note, you can create header and footer templates that will be used on each page of your PDF by passing them into render_to_pdf as part of kwargs.

这篇关于django pdf 导出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆