从django表格打印PDF

时间:2011-10-11 15:24:56

标签: python django pdf django-views

我正在为我的一个可填写的PDF构建PDF构建器的早期过程。

此时我正在尝试在点击“打印表单”按钮时显示PDF,但此刻我没有收到任何错误,只是打开一个空白标签(firefox)。

这是我的lib / tools.py中的print_rdba:

def print_rdba(client=None, data=None ,investment_form=None):
from django.http import HttpResponse
from clients.models import Transit
from products.models import ProductCategory
import cStringIO as StringIO
from dateutil.parser import parse
from datetime import date
from settings import URL
import re
from dateutil.relativedelta import relativedelta
from rates.models import InterestOption
from products.models import Product

URL = "/media/files/investment_forms/whatever.pdf"
file = ''
if investment_form:
    file = "%s" % URL

fdf = '<?xml version="1.0" encoding="UTF-8"?>\n<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">\n\t<fields>'


fdf += '''</fields>
    <f href="%s" target="_blank"/>
    </xfdf>''' % file

fdf = fdf.replace('^M', '')

response = HttpResponse(fdf.encode("ISO-8859-1"), mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=RDBA.xfdf'
return response

在我的视图上检查以确保按下按钮:

if request.POST.has_key('submit_rdba_form'):
            return print_rdba(client=primary_member, data = form.data)

现在还有其他我想念的东西吗?我将使用.xfdf来填充表单,但就像我之前说过的那样,我只是在显示pdf时遇到了麻烦。

由于

1 个答案:

答案 0 :(得分:3)

您的函数返回的响应不会显示pdf,但会显示treated as a file attachment(即保存到磁盘)。这是因为这一行:

response['Content-Disposition'] = 'attachment; filename=RDBA.xfdf'

告诉浏览器要保存文件RDBA.xfdf

检查是否完全调用了print_rdba函数。如果您的按钮名称为submit_rdba_form,则request.POST.has_key('submit_rdba_form')将为False

您也可以尝试将标记放入模板文件中,然后将模板呈现给响应。这符合Django的MTV哲学(模型 - 模板 - 视图,类似于MVC,其中应用程序逻辑与表示分离)并且更好,特别是因为您计划向文档添加表单:

您的xfdf.html文件夹中

templates

<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
    <fields>
    </fields>
    <f href="{{file}}" target="_blank"/>
</xfdf>

新print_rdba

from django.http import HttpResponse
from django.template.loader import get_template
from django.template import Context

def print_rdba(client=None, data=None ,investment_form=None):
    file = "/media/files/investment_forms/whatever.pdf"

    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=RDBA.xfdf'
    template = get_template("xfdf.html")
    xfdf = template.render(Context({"file":file}))
    response.write(xfdf)
    return response