2010-10-28 55 views
2

我有一個Django模型如下:的Django FileField字段編碼

class ExportFile(BaseExportFile): 
    created_timestamp = models.DateTimeField(auto_now=True, editable=False) 
    data = models.FileField(upload_to='exports') 

,並呈現一個模板來創建一個CSV文件中的視圖功能:

def create_csv(request): 

     context = Context({'data': MyModel.objects.all()}) 
     rendered = render_to_string('mytemplate.html', context) 

     # create tradefile and save 
     cf = ContentFile(rendered) 

     tf = ExportFile() 
     tf.data.save('myfile.csv', cf) 

     tf.save() 

     response = HttpResponse(mimetype='text/csv') 
     response['Content-Disposition'] = 'attachment; filename=%s' % 'myfile.csv' 
     response.write(rendered) 

     return response 

的觀點不僅節省了CSV數據到FileField,但它也會將其返回給瀏覽器。我遇到的問題是瀏覽器文件完美地工作,但保存在模型上的文件是兩倍的大小,當我使用diff程序時,我可以看到額外的隱藏字符。我認爲它必須與mime類型和django自動保存utf8相關,但我無法想象它!

回答

2

解決了問題!

ContentFile是cStringIO.StringIO的一個子類,它處理ASCII編碼的文件。字符串因此需要編碼爲ASCII,因爲django中的所有內容默認爲UTF8

cf = ContentFile(rendered.encode('ascii'))