Кодировка Django FileField - PullRequest
       6

Кодировка Django FileField

2 голосов
/ 28 октября 2010

У меня есть модель Django следующим образом:

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, но и возвращает их в браузер. У меня проблема в том, что файл браузера работает отлично, но файл, сохраненный на модели, в два раза больше, и когда я использую программу сравнения, я вижу дополнительные скрытые символы. Я думаю, что это должно быть связано с типом mime vs django auto save utf8, но я просто не могу понять это!

1 Ответ

2 голосов
/ 29 октября 2010

Решил проблему!

ContentFile является подклассом cStringIO.StringIO - который работает с файлами в кодировке ASCII. Поэтому строка должна быть закодирована как ASCII, так как все в django по умолчанию UTF8

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