2010-10-28 4 views
2

J'ai un modèle de django comme suit:Django FileField encodage

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

et une fonction de vue qui rend un modèle pour créer un fichier 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 

La vue permet non seulement les données csv à un FileField mais il le renvoie également au navigateur. Le problème que j'ai est le fichier du navigateur fonctionne parfaitement, mais le fichier enregistré sur le modèle est deux fois la taille et quand j'utilise un programme diff, je peux voir des caractères cachés supplémentaires. Je pense que ça doit être en rapport avec le type mime vs django auto saving utf8 mais je n'arrive pas à le comprendre!

Répondre

2

Résolu le problème! ContentFile est une sous-classe de cStringIO.StringIO - qui traite des fichiers codés ASCII. La chaîne doit donc être codée en ASCII, car tout ce qui est dans django est UTF8 par défaut

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