2010-10-28 59 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'))