有人可以向我提供一个全面的示例,说明如何view
django
使用PDF
返回wkhtmltopdf
。 django-wkhtmltopdf
附带的示例数量有限,并且它们假定我没有的知识水平。我查看了源代码,但我无法做出如何使用它的正面或反面(例如,PDFTemplateView
和PDFTemplateResponse
之间的区别是什么?!?)
我将非常感谢任何帮助。
BTW(我也使用页眉和页脚的模板)
修改
def some_view(request,sID):
something = get_object_or_404(Something,id=sID)
return render_to_response('something.html', {'something':something}, context_instance=RequestContext(request))
如何获得以下简单视图,为我提供pdf
而不是html
文件?
编辑2
我目前正在玩:
def pdf_view(request,sID):
template = 'pdf.html'
something = get_object_or_404(Something,id=sID)
context = {
'something' : Something,
'object_for_header_and_footer': something.object_for_header_and_footer,
}
cmd_options = settings.WKHTMLTOPDF_CMD_OPTIONS
return PDFTemplateResponse(request=request,
context=context,
template=template,
filename='something',
header_template='header.html',
footer_template='footer.html',
cmd_options=cmd_options)
但我在'str' object has no attribute 'update'
收到/usr/local/lib/python2.7/dist-packages/wkhtmltopdf/utils.py in wkhtmltopdf, line 74
。我不知道是否要开始攻击wkhtmltopdf?!?!
答案 0 :(得分:22)
PDFTemplateView和PDFTemplateResponse之间的区别在于视图是基于类的视图。 PDFTemplateResponse呈现pdf数据并设置正确的response headers。要添加页眉和页脚:
# urls.py
from django.conf.urls.defaults import *
from wkhtmltopdf.views import PDFTemplateView
urlpatterns = patterns('',
...
url(r'^pdf/$', PDFTemplateView.as_view(template_name='my_template.html',
filename='my_pdf.pdf',
header_template='my_header_template.html',
footer_template='my_footer_template.html',
...
), name='pdf'),
)
在浏览器中打开pdf /将根据my_template.html,my_header_template.html和my_footer_template.html开始下载my_pdf.pdf。
advanced example显示了如何子类化PDFTemplateView扩展和更改PDFTemplateView的逻辑。要了解会发生什么,请阅读Using class based views。
与header_template
和footer_template
一样,您可以定义response_class
。因为PDFTemplateResponse是默认值,所以您不必定义它。
修改强>
以下简单视图为您提供了pdf而不是html。这不是使用django-wkhtmltopdf。您可以在html2pdf函数中使用wkhtmltopdf。
def some_view(request):
t = loader.get_template('myapp/template.html')
c = RequestContext(request, {'foo': 'bar'})
html = t.render(c)
pdf_data = html2pdf(html) # Your favorite html2pdf generator
response = HttpResponse(pdf_data, content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="some_filename.pdf"'
return response
编辑2
带上下文的简单视图:
template.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Untitled</title>
</head>
<body>
<h1>{{ title }}</h1>
</body>
</html>
urls.py
from views import MyPDFView
urlpatterns = patterns('',
(r'^pdf/', MyPDFView.as_view()),
)
views.py
from django.views.generic.base import View
from wkhtmltopdf.views import PDFTemplateResponse
class MyPDFView(View):
template='template.html'
context= {'title': 'Hello World!'}
def get(self, request):
response = PDFTemplateResponse(request=request,
template=self.template,
filename="hello.pdf",
context= self.context,
show_content_in_browser=False,
cmd_options={'margin-top': 50,},
)
return response
编辑3
如果您使用DetailView,则可以将对象添加到上下文中:
url(r'^books/(?P<pk>\d+)/$', MyPDFView.as_view(), name='book-detail'),
class MyPDFView(DetailView):
template='pdftestapp/template.html'
context= {'title': 'Hello World!'}
model = Book
def get(self, request, *args, **kwargs):
self.context['book'] = self.get_object()
response=PDFTemplateResponse(request=request,
template=self.template,
filename ="hello.pdf",
context=self.context,
show_content_in_browser=False,
cmd_options={'margin-top': 50,}
)
return response
答案 1 :(得分:2)
嗯,错误表明你正在将字符串传递到你不应该的地方。
检查完source code后,我猜在settings.py
中你有WKHTMLTOPDF_CMD_OPTIONS
字符串,类似
WKHTMLTOPDF_CMD_OPTIONS = 'some_option_here'
但你应该在那里指定一个词典:
WKHTMLTOPDF_CMD_OPTIONS = {
'quiet': True,
}
否则您的代码应该可以正常工作。