使用Django模板呈现的纯文本中的Windows换行符

时间:2017-08-24 02:07:07

标签: django windows templates

我正在尝试使用Django 1.10(Python 3.5)视图/模板将数据导出到纯文本文件。此文本文件必须与操作系统无关,因为Windows用户应该可以轻松查看该文件。不幸的是,当Django渲染我的模板时,文件中有\ r \ n(Windows友好)换行符,换行符会神奇地转换为\ n(Mac / Linux友好)换行符。是什么给了什么?

以下是我尝试呈现纯文本文件的方式:

from django.template import loader, Context

def myview(request):
    my_data = get_my_data()
    response = HttpResponse(content_type='text/plain')
    response['Content-Disposition'] = 'attachment; filename="export.txt"'
    template = loader.get_template('export.txt') # <- this file has \r\n line breaks
    context = Context({'data': my_data})
    response.write(template.render(context))

    return response

在Windows中使用Chrome或Edge下载导出的文件并在记事本中打开时,不会遵守换行符,并且在Notepad ++中查看文件(并显示EOL字符)时,只有\ n字符在那里!任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,不幸的是,这似乎发生在Django的模板加载器/引擎的某个地方。如果直接启动模板而不通过get_template()(或render_to_string()以及使用相同调用的类似方法),则不会发生这种情况。这是我的测试用例的简化版本:

>>> from django import template
>>> t = template.Template('{% for line in dataset %}{{ line.field1 }}\t{{ line.field2 }}\r\n{{ line.field3 }}\t{{ line.field4 }}\r\n{% endfor %}')
>>> dataset = {'field1': 'F1', 'field2': 'F2', 'field3': 'F3', 'field4': 'F4'}
>>> c = template.Context({'dataset': dataset})
>>> t.render(c)

使用\ r \ n到位正确输出模板:

u'F1\tF2\r\nF3\tF4\r\n'

但是,如果我从文件加载相同的模板,就像你一样使用get_template(),它会删除它们:

>>> from django.template import loader
>>> t = loader.get_template('test.txt')
>>> t.render(c)
u'F1\tF2\nF3\tF4\n'

我试着浏览Django代码以确定这种情况发生的地方,但是由于时间限制,我最终做了快速的&#39;脏&#34;修复:

>>> t = loader.get_template('test.txt')
>>> out = t.render(c).replace('\n', '\r\n')

请注意,这也取代了您在实际数据字段中可能具有的任何\ n,因此请谨慎使用....