Создание PDF-файлов с помощью django (wkhtmltopdf)
может кто-нибудь, пожалуйста, предоставьте мне исчерпывающий пример того, как получить 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
вместо ?
правка 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?!?!
2 ответов
разница между PDFTemplateView и PDFTemplateResponse заключается в том, что представление является представлением на основе класса. И PDFTemplateResponse отображает данные pdf и устанавливает правильный заголовки ответа. Чтобы добавить верхний и Нижний колонтитулы:
# 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_pdf.pdf на основе my_template.HTML-код, my_header_template.html и my_footer_template.формат html.
на дополнительно показывает, как подкласс PDFTemplateView расширение и изменение логики PDFTemplateView. Чтобы понять, что происходит, прочитайте использование представлений на основе классов.
как header_template
и footer_template
вы можете определить response_class
. Поскольку PDFTemplateResponse является значением по умолчанию, его не нужно определять.
редактировать
следующий простой вид предоставляет вам pdf вместо html. Это не использование django-wkhtmltopdf. Вы можете использовать wkhtmltopdf в своем html2pdf функция.
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
простой вид с контекстом:
шаблон.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
Хмм ошибка указывает, что вы передаете строку где-то, что вы не должны.
после проверки его исходный код, Я думаю, в settings.py
вы WKHTMLTOPDF_CMD_OPTIONS
как строка, что-то вроде
WKHTMLTOPDF_CMD_OPTIONS = 'some_option_here'
но вы должны назначить там дикт:
WKHTMLTOPDF_CMD_OPTIONS = {
'quiet': True,
}
в противном случае ваш код должен работать нормально.