【问题标题】:Windows line breaks in plain text rendered using Django template使用 Django 模板呈现的纯文本中的 Windows 换行符
【发布时间】:2017-08-24 02:07:06
【问题描述】:

我正在尝试使用 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 字符!任何帮助将不胜感激:)

【问题讨论】:

    标签: django windows templates


    【解决方案1】:

    我遇到了同样的问题,不幸的是,这似乎发生在 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 代码以确定发生这种情况的位置,但由于时间有限,我最终改为进行“快速'n'dirty”修复:

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

    请注意,这也会替换您在实际数据字段中可能拥有的任何 \n,因此请谨慎使用....

    【讨论】:

    • 啊!旧的字符串替换技巧。有趣的是,当您陷入困境时,最简单的解决方案如何逃避您!非常感谢您在这里的彻底回答。
    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多