使用reportlab创建表

时间:2018-01-17 16:55:14

标签: python django reportlab

我试图在django中循环用户数据,以便在reportlab的帮助下创建一个表。但是我遇到了一个“属性错误”,该错误导致了#tuple'对象没有属性'用户名'。

def admin_tools_pdf(request):
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment;   filename="users.pdf" '  
buffer=BytesIO()
p=canvas.Canvas(buffer,pagesize=A4)
width, height = A4
styles = getSampleStyleSheet()
styleN = styles["BodyText"]
styleN.alignment = TA_LEFT
styleBH = styles["Normal"]
styleBH.alignment = TA_CENTER
user_data=User.objects.all().values_list('username','email')
username=Paragraph("'<b>Username</b>'",styleBH)
email=Paragraph("'<b>Email Id</b>'",styleBH)
data=[[username,email]]
for i in user_data:
    username=str(i.username).encode('utf-8')
    email=str(i.email).encode('utf-8')
    user=Paragraph(username,styleN)
    mail=Paragraph(email,styleN)
    data+=[user,mail]
table=Table(data,colWidths=[4*cm,4*cm,4*cm,4*cm])
table.wrapOn(p, width, height)
table.wrapOn(p, width, height)
table.drawOn(p)
p.showpage()
p.save()
pdf=buffer.getvalue()
buffer.close()
response.write(pdf)
return response

导入文件是:

from io import BytesIO
from reportlab.pdfgen import canvas

from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle,Paragraph
from reportlab.lib.pagesizes import A4, cm 
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER

非常感谢!

1 个答案:

答案 0 :(得分:1)

values_list返回元组列表,这些元组不支持点解除引用。您需要username = i[0].encode('utf-8')之类的内容,或使用values代替词汇并使用i['username'].encode('utf-8')。或者使用User.objects.all().only('username', 'email') - 这将为您提供模型实例,其中这些字段已加载到内存中,而所有其他字段都会延迟,这将支持点引用。

为了清晰起见,我使用values() - 比values_list更容易说出正在发生的事情,而模型实例比您需要的更重量级如果您确实需要更多字段,则可以隐藏进行额外查询或更新初始查询集的需要。