2016-07-22 98 views
0

我試圖生成一個PDF文件,並將其添加到Django FileField。沒有什麼幻想,但我似乎無法得到我將生成的PDF添加到FileField失敗;添加本地PDF工程

當使用我的硬盤驅動器上的本地文件,一切工作正常:

>>> invoice = Invoice.objects.get(pk=153) 
>>> local_file = open('my.pdf') 
>>> djangofile = File(local_file) 
>>> type(local_file) 
<type 'file'> 
>>> type(djangofile) 
<class 'django.core.files.base.File'> 
>>> invoice.pdf = djangofile 
>>> invoice.pdf 
<FieldFile: my.pdf> 
>>> invoice.save() 
>>> invoice.pdf 
<FieldFile: documents/invoices/2016/07/my.pdf> 

但是用生成的PDF試圖同時,事情不要」 t工作:

>>> invoice = Invoice.objects.get(pk=154) 
>>> html_template = get_template('invoicing/invoice_pdf.html') 
>>> rendered_html = html_template.render({'invoice': invoice}).encode(encoding="UTF-8") 
>>> pdf_file = HTML(string=rendered_html).write_pdf() 
>>> type(pdf_file) 
<type 'str'> 
>>> djangofile = File(pdf_file) 
>>> type(djangofile) 
<class 'django.core.files.base.File'> 
>>> invoice.pdf = djangofile 
>>> invoice.pdf 
<FieldFile: None> 
>>> invoice.save() 
>>> invoice.pdf 
<FieldFile: None> 

我在做什麼錯?爲什麼一個django.core.files.base.File對象被接受,另一個不是?

回答

1

File()只是Python文件對象的一個​​包裝。它不適用於你生成的PDF等字符串。爲此,您需要ContentFile class。嘗試:

(...) 
djangofile = ContentFile(pdf_file) 
invoice.pdf = djangofile 
invoice.pdf.name = "myfilename.pdf" 
invoice.save() 
+0

謝謝,這有幫助。缺少的是我還需要通過'invoice.pdf.name'爲存儲提供一個文件名,否則不會發生實際的'save()'。我已經調整了你的答案。 – SaeX