Как уже упоминали другие люди, лучший способ сделать это - создать шаблон, а затем преобразовать результат, используя одну из многочисленных библиотек, в PDF. Этот метод предоставляет вам обычный контроль над шаблонами, например, с помощью тегов.
Я использовал ранее упомянутую настройку ReportLab / Pisa, но нашел, что она довольно ограничивающая, большинство макетов приходится создавать с использованием таблиц, а многие части спецификации CSS2 еще не реализованы.
Более простая в использовании библиотека - wkhtmltopdf , которая представляет собой автономный дистрибутив WebKit. Это дает преимущество в том, что ваши шаблоны отображаются так же, как любой браузер webkit, и, таким образом, вы можете использовать специфические дополнения webkit, такие как части спецификации CSS3, существующие в WebKit.
Используя библиотеку-оболочку django-wkhtmltopdf вы можете render_to_pdf
в своем представлении вместо обычного Django render_to_response
.
Отказ от ответственности: я участник этой библиотеки.
Обновление
Эта библиотека была преобразована в CBV, и большая часть информации ниже (которую я оставлю, чтобы помочь добавить некоторый контекст) теперь реализована в самой библиотеке для удобства.
См. Документацию quickstart для примера того, как реализовать приведенный ниже кодовый блок. Если вам нужно использовать более сложное использование, вы можете создать подкласс PDFTemplateView
и добавить различные параметры, такие как имя файла и поля.
Пример просмотра:
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 в представление, чтобы вы могли разрабатывать его в браузере. Это немного уродливый способ сделать это в настоящее время, но в скором времени планируется это исправить.
Используя это представление, вы можете зациклить содержимое objects
в своем представлении, как обычно, и даже расширить базовый шаблон. Обычно я использовал другую таблицу стилей специально для PDF-файлов для удобства сопровождения и читабельности стилей, так как вам нужно сделать несколько вещей по-другому для PDF-файлов, например, установить минимальную высоту, если вы хотите сохранить блок нижнего колонтитула в одном месте .
В этой заметке вы можете создавать шаблоны верхнего и нижнего колонтитула, которые будут использоваться на каждой странице вашего PDF, передавая их в render_to_pdf как часть kwargs
.