我正在尝试使用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字符在那里!任何帮助将不胜感激:)
答案 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,因此请谨慎使用....