2016-07-22 10 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> 

私は間違っていますか?なぜ1つの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

関連する問題