Форум сайта python.su
Доброго времени суток!
Помогите, пожалуйста, разобраться с этим примером.
Мне нужно было добавить в views.py код из учебника. И дописать адрес в urls.py. Вот, что получилось.
Но у меня, естественно, не работает.
Выдает ошибку:
'module' object is unsubscriptable, в коде отмечена.
Есть views.py
from django.http import HttpResponse
from ecomerce_book.product.models import Product
from reportlab.platypus.doctemplate import SimpleDocTemplate
from reportlab.platypus import Paragraph, Spacer
from reportlab.lib import styles
def product_pdf(request):
response = HttpResponse(mimetype='application/pdf')
response[Content-Disposition'] = 'attachment; filename=product.pdf'
doc = SimpleDocTemplate("products.pdf")
Catalog = []
header = Paragraph("Product Inventory", styles['Heading1']) <---Ошибка в этой строке !!!!!!!!!
Catalog.append(header)
style = styles['Normal']
for product in Product.objects.all():
for product in Product.objects.all():
p = Paragraph("%s" % product.name, style)
Catalog.append(p)
s = Spacer(1, 0.25*inch)
Catalog.append(s)
doc.build(Catalog)
return response
urlpatterns = pattern('',
url(r'^product_pdf', 'ecomerce_book.product.views.product_pdf'),
)
Отредактировано (Фев. 11, 2011 12:13:12)
Офлайн
Во-первых, у тебя походу ошибка тут:
from reportlab.lib import sytles # не sytles, наверное, а styles
Офлайн
EnchantnerСпасибо за ответ. Это моя описка на форуме, т.к. текст печатал, а не вставлял. Уже отредактировал.
Во-первых, у тебя походу ошибка тут:тогда становится понятна и вторая ошибка - ты пытаешься обратиться к styles как к словарю ( styles ) , а это модуль.from reportlab.lib import sytles # не sytles, наверное, а styles
Офлайн
Просмотрел модуль из reportlab.lib styles
Добавил строку: styles = getSampleStyleSheet()
Ошибка исчезла. Генерируется pdf файл, но испорченный.
Офлайн
Маленькая победа. Работает. Но пока вывод цикла for не тот, что нужен.
Добавил строку:
from reportlab.lib.styles import getSampleStyleSheet
doc = SimpleDocTemplate("product.pdf")
doc = SimpleDocTemplate(filename=response)
Офлайн
Теперь полная победа.
Убрал один цикл и в оставшийся добавил:
p2 = Paragraph("%s" % product.description, style)
Catalog.append(p2)
Офлайн
Это конечный вариант(рабочий) :cool:
from django.http import HttpResponse
from ecomerce_book.product.models import Product
from reportlab.platypus.doctemplate import SimpleDocTemplate
from reportlab.platypus import Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib import styles
from cStringIO import StringIO
def product_pdf(request):
response = HttpResponse(mimetype='application/pdf')
response[Content-Disposition'] = 'attachment; filename=product.pdf'
temp = StringIO()
doc = SimpleDocTemplate(temp)
Catalog = []
styles = getSampleStyleSheet()
header = Paragraph("Product Inventory", styles['Heading1'])
Catalog.append(header)
style = styles['Normal']
for product in Product.objects.all():
p1 = Paragraph("%s" % product.name, style)
p2 = Paragraph("%s" % product.description, style)
Catalog.append(p1)
Catalog.append(p2)
s = Spacer(1, 0.25*inch)
Catalog.append(s)
doc.build(Catalog)
response.write(temp.getvalue())
temp.close()
return response
Офлайн