【问题标题】:Django: render a txt file with linebreaksDjango:呈现带有换行符的文本文件
【发布时间】:2017-06-16 22:25:16
【问题描述】:

我需要在 Django 中返回一个 txt 文件作为 HTTPResponse。该文件需要包含从列表生成的多行(例如 ['line one', 'line two'])。 如果我使用 DTL 和模板,我不能插入除 html 特定的换行符之外的任何换行符。所以,我目前的解决方案是用 csv.writer 写行来响应。它可以工作,但是没有更优雅的方法来获取看起来像这样的 txt 文件吗?

line one
line two

更新:我想,我的问题是我需要 CR,LF 换行符。

【问题讨论】:

  • 为什么 csv 编写器不如使用仅包含 for 循环的额外模板优雅?这当然取决于您期望这部分代码如何发展。如果在不久的将来还可以,那么只需使用 csv 编写器或简单地将字符串列表与您想要的换行符连接起来并返回。确保设置正确的内容类型。
  • 我不是说使用额外的模板。我的意思是比导入 csv 更简洁。只是一种将换行符硬编码到 httpresponse 中的方法。
  • 在这种情况下,您应该将当前代码添加到您的答案中(编辑答案,不要在评论中这样做)。

标签: python django


【解决方案1】:

你的断言是完全错误的。 Django 模板语言绝不限于 HTML;它适用于任何格式,您可以非常愉快地使用它来生成文本文件。

【讨论】:

  • 那么,我该如何添加换行符呢?我试过了,看看假设我的行在一个名为“mylines”的列表中: {% for line in mylines %} {{ line|linebreak }} {{% endfor %}} 或类似的东西会给我


    标签,但不是真正的换行符。

  • 您可以在模板中输入换行符。或使用\n
  • 这是我尝试的第一件事,伙计。事实证明,换行符在那里,只是不是我需要的。我需要windows风格的,CR,LF。
【解决方案2】:

如果您有一个字符串列表,并且想在响应中仅将其作为一个字符串输出,最简单的方法是使用join

lines = ['line one', 'line two']
response_content = '\n'.join(lines)
return HttpResponse(response_content, content_type="text/plain")

在一个模板内:

 {% for line in mylines %}
     {{ line }}
 {% endfor %}

这应该将每一行放在输出中自己的一行。

【讨论】:

  • 这是我在使用 csv 之前所做的。但这给了我记事本无法识别的换行符。
  • 记事本可能不使用常规的\n 换行符。在这种情况下,您可能必须将连接分隔符更改为 \r\n 或类似的东西。另请参阅superuser.com/a/362092 并搜索“记事本换行符”(或更一般的 ms 窗口)。如果这将是专门用于该操作系统的文件,您可能需要考虑将输出的编码更改为 windows latin1 编码。
  • 是的!谢谢!将分隔符更改为 \r\n 是我一直在寻找的简洁解决方案。
猜你喜欢
  • 1970-01-01
  • 2010-11-24
  • 2017-06-19
  • 1970-01-01
  • 2012-01-28
  • 2015-11-18
  • 2016-05-09
  • 2011-01-04
  • 1970-01-01
相关资源
最近更新 更多