Caro Mário Neto,
Veja esta linha na sua função for_livros:
> return str(lv)
Esta linha faz duas coisas:
1) a expressão str(lv) gera uma string a partir do objeto lv, que é um
livro. Como isso funciona? Os tutoriais de Python e de Django explicam
que a função str() invoca o método __str__ do seu objeto. Se você não
definiu este método __str__ no seu modelo de Livro, então aparece
exatamente o que você mostrou: "Livro object". No Django este é um
recurso básico, pois permite customizar o que aparece nas listagens do
admin, por exemplo. Se quiser gerar uma saída Unicode, use a função
unicode(), que por sua vez invocará o método __unicode__.
2) o comando return encerra imediatamente a execução da função e
devolve o valor da expressão para o contexto que invocou a função. Por
este motivo, aparece apenas um livro no seu PDF: o loop for dentro da
função for_livros é executado apenas uma vez, pois o processamento da
função termina no return.
Mário, me perdôe se eu pareço chato ao insistir neste ponto, mas a
seguir eu vou dar uma resposta que eu costumo dar muitas vezes nesta e
em outras listas ligadas a Python: estude o tutorial de Python [1],
disponível em português:
http://www.pythonbrasil.com.br/moin.cgi/TutorialPython
Se você se dedicar um tempo a ler este tutorial inteiro, do começo até
o final, aprenderá muitos recursos essenciais da linguagem, que
aumentarão muito a sua produtividade.
Python tem uma sintaxe muito simples, o que é ótimo, mas em
consequência às vezes a gente observa as pessoas usando a linguagem
"de orelhada", aplicando conceitos aprendidos em outras linguagens.
Essa estratégia até funciona inicialmente, mas pode consolidar vícios
de programação que a longo prazo vão te gerar muitos problemas e perda
de tempo. Evite isso e faça como todos os gurus de Python que eu
conheço: leia o tutorial escrito pelo autor da linguagem com atenção,
do começo até o final, e aproveite muito melhor o seu tempo
trabalhando com esta linguagem maravilhosa.
[ ]s
Luciano
def indexPdf(request):
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=gerado.pdf'
lista_livros = Livro.objects.all().order_by('-publicacao')[:5]
p = canvas.Canvas(response)
for lv in lista_livros:
p.drawString(100, 100, str(lv.nome))
p.showPage()
p.save()
return response